PDA

Просмотр полной версии : Как в С++ хранятся в памяти значения структуры?


Yegor
18.08.2011, 02:50
Имеем некоторую структуру:

Struct MyStruct
{
wchar_t var1[10];
int var2;
}

Вопрос как будет размещаться в памяти строка относительно струткуры?
В ячейке памяти где располагается var1 будет указатель на область памяти где расположиться строка или строка будет располагаться непосредственно начиная с адреса переменной var1?
Где будет располагаться значение числовой переменной var2?

supernewbie2
18.08.2011, 03:07
ну в дельфе смещение узнается таг

TMyClass=class
s:string;
end;

WriteLn(dword(@TMyClass(nil).s));

xkor
18.08.2011, 03:08
Yegor, var1 тут я бы строкой не назвал, это просто статический массив символов, так что в структуре будет 20 байт var1 и 4 байта var2 подряд

Добавлено через 42 секунды
supernewbie2, причем тут смещения, тем более на дельфи?

Yegor
18.08.2011, 03:29
В принципе хранятся так же как и записи в делфи. Вся статика в той же области памяти где и структура. Если есть динамические строки\массивы то в структуре на нее размещается указатель.

xkor
18.08.2011, 10:14
Yegor, эт ты сам себе отвечаешь?)

Yegor
18.08.2011, 12:41
xkor, ну эт я типа разобрался с Вашей помощью и констатирую факты :)

mira
18.08.2011, 19:36
ну в дельфе смещение узнается таг

TMyClass=class
s:string;
end;

WriteLn(dword(@TMyClass(nil).s));

познавательный код для ознакомления с исключениями виндос

alexteam
18.08.2011, 19:40
mira, какими ?

mira
18.08.2011, 19:45
mira, какими ?

access violation имхо

xkor
18.08.2011, 19:45
alexteam, он видимо счёл что в том коде будет обращение к полю объекта, а не просто возврат адреса без каких либо действий над несуществующим объектом)

mira
18.08.2011, 19:51
хотя не, обращения к s ж не произойдет

Добавлено через 4 минуты
даже если будет работать использование сего приема для меня "говнокодерство" без обид =)

а если по теме - да Struct это тотже record(делфи) ну при переносе кода на делф проблем не возникало с несоответствиями полей

alexteam
18.08.2011, 19:54
даже если будет работать использование сего приема для меня "говнокодерство" без обид =)
пакс юзаешь ?

supernewbie
18.08.2011, 19:55
видимо не юзает)

xkor
18.08.2011, 20:13
Struct это тотже record(делфи)я бы сказал что аналогом struct в дельфи является не просто record, а packed record, ибо обычный поля выравнивает (так чтоб смещение поля было кратно 4м байтам если не ошибаюсь по умолчанию)

mira
19.08.2011, 01:07
я бы сказал что аналогом struct в дельфи является не просто record, а packed record, ибо обычный поля выравнивает (так чтоб смещение поля было кратно 4м байтам если не ошибаюсь по умолчанию)
разумеетса кэп. у меня в проекте всеравно все packed record. за выравниванием сам смарю.

mira
19.08.2011, 01:14
пакс юзаешь ?

сначало мне нужно его завернуть в ДЛЛ. пока на фсе все.
тока нужны ли трюки эти в скриптах типа этого:

Yegor
19.08.2011, 03:55
я бы сказал что аналогом struct в дельфи является не просто record, а packed record, ибо обычный поля выравнивает (так чтоб смещение поля было кратно 4м байтам если не ошибаюсь по умолчанию)

Да вроде уже нет я везд в делфи объявляю как просто record и ошибок нет хотя в структуры пишутся пакеты которые кое где читаю по смещениям в памяти.

Где то я читал что в делфи все record по умолчанию идут packet, и что эта директива осталась со времен турбопаскаля для совместимости.

supernewbie
19.08.2011, 10:08
в делфи все record по умолчанию идут packet
в д7 точно нет такого

destructor
23.08.2011, 03:55
Вопрос как будет размещаться в памяти строка относительно струткуры?
полностью зависит от компилятора и самый труЪ метод, это посмотреть идой\олькой память такой программы:
Struct MyStruct
{
wchar_t var1[10];
int var2;
} ms;
int main()
{
ms.var1[0]=0;
ms.var1[1]=1;
ms.var1[2]=2;
ms.var1[3]=3;
ms.var1[4]=4;
ms.var1[5]=5;
ms.var1[6]=6;
ms.var1[7]=7;
ms.var1[8]=8;
ms.var1[9]=9;
ms.var2=0x666;
__asm int 3;
return 0;
};