Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вопрос про CString (для профессионалов) 08.01.02 21:41
Автор: Serus Статус: Незарегистрированный пользователь
|
Я програмирую на MS Visual C++ 6.0
Меня интересует, как будет распределятья память в следующем случае.
{
....
CString sText;
sText = pszData; //ну например, 10 Мб
funck(sText);
.....
}
void funck(CString sText)
{
...
//Какие-нибудь операции с sText
...
}
Вопрос N1:
При вызове функции funck будет ли выделяться еще 10 Мб памяти?
Если да то где (на стеке или нет)?
Вопрос N2:
Как передается содержимое sText в функцию funck (через стек или через указатель)?
Вопрос N3:
После выхода из funk изменится ли содержимое sText?
Заранее спасибо!!!
|
 |
Совет на будующее, авось пригодится 11.01.02 00:55
Автор: PS <PS> Статус: Elderman
|
SDK решает все проблеммы.
Вот маленький примерчик из него:
const CString& CString::operator=(const CString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < 0 && GetData() != _epDataNil)| stringSrc.GetData()->nRefs < 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
|
 |
[C++] Вопрос про CString (для профессионалов) 09.01.02 01:08
Автор: LiNX Статус: Незарегистрированный пользователь
|
1. В примере присутсвует неудачное, имхо, повторение sText, из-за чего плохо воспринимается суть происходящего.
2. Структура класса CString такова, что он состоит из одного LPTSTR m_pchData указателя на буфер - и больше ничего ! (не считая функций, конечно же), а потому память всего класса 32 бита.
3. Класс CString очень хитро построен : при передаче параметров по значению (32 бита) используется тот же самый объект в памяти, что и для исходного CString, поэтому, на первый взгляд, изменения внутри функции должны влиять на исходный объект ,- в реальности это не так. При обращении к объекту в функции, строится новый буфер с данными (в куче), с которым и происходит работа (при выходе из области видимости деструктор уничтожает этот объект). В структуре, на которую ссылается LPTSTR m_pchData существует счетчик подобных ссылок.
Т.о.:
1. При вызове функции funck память (10 Мб) выделена не будет. Память будет выделена при первой попытке записи (будут использваны переопределенные операторы), и выделена память будет в куче (при том, что "сам CString" сидит в стеке (если не задействована специальная оптимизация - тогда он будет в регистре)).
2. sText передается через стек (32 бита) (по значению (существует передача по значению или по адресу(указателю) - они все передаются через стек (кроме см п. 1))
3. После выхода значение sText не изменится, т. к. передача происходила по значению, а если бы происходила по ссылке(адресу, const_указателю), то значение можно менять.
ЗЫ: необходимо учитывать, что CString - это класс, который может быть реализован при желании и по другому.
|
|
|