защо размерът на тази структура не е правилен

Имам този примерен код, който украсих с pack, за да се уверя, че размерът му е 5 байта (4 за int и 1 за char).

но отпечатва, че размерът на структурата е 8 байта.

#pragma pack push
#pragma pack 1
struct mystruct
{
    int x;
    char y;
};
#pragma pack pop

//static_assert(sizeof(mystruct) == 5, "Size of mystruct should be 5 byte.");

int _tmain(int argc, _TCHAR* argv[])
{
    int x=sizeof(mystruct);
    printf("size of struct is %d\n",x);
    return 0;
}

Защо te pck не работи?

Как мога да се уверя, че размерът на структурата винаги е 5.


person mans    schedule 25.04.2014    source източник
comment
Моля, прочетете за Padding. вашият въпрос вече има повече от 100 дубликати само на SO.   -  person Dayal rai    schedule 25.04.2014
comment
C или C++? Има разлика. Моля, просто изберете този, който използвате.   -  person stefan    schedule 25.04.2014
comment
@Stefan съдя C++ на Visual Studio.   -  person mans    schedule 25.04.2014
comment
@mans Това е една от любимите ми правописни грешки ;-) (Все пак никога не бихте си позволили да го направите.)   -  person molbdnilo    schedule 25.04.2014
comment
И какво се опитваш да направиш с това? Защо е проблем, ако размерът не е 5?   -  person James Kanze    schedule 25.04.2014


Отговори (4)


Вашият прагма синтаксис е грешен.

Опитайте тази:

#pragma pack(push,1)
...
#pragma pack(pop)

Демо.

person n. 1.8e9-where's-my-share m.    schedule 25.04.2014
comment
Това не е гарантирано да работи във всички реализации - person pmg; 25.04.2014
comment
@pmg: OP посочи коя реализация използва. Това е правилният подход. Използването на char[N] е откровено нелепо. - person Lightness Races in Orbit; 25.04.2014
comment
@pmg Вече тествах и трябва да работи и на GNU компилатор. - person mans; 25.04.2014
comment
@pmg Прагмите по дефиниция не са гарантирани да работят във всички реализации. Те дават директиви, специфични за изпълнението. - person n. 1.8e9-where's-my-share m.; 25.04.2014

Вярвам, че на компилатора е позволено да игнорира прагмата pack; може би може да се отмени с превключватели на компилатора.

person Codor    schedule 25.04.2014
comment
Разрешено в какъв смисъл? Стандартът дори не дефинира тази прагма. - person Lightness Races in Orbit; 25.04.2014
comment
@Lighness Races in Orbit Е, това го прави по-добре. - person Codor; 25.04.2014

Компилаторът винаги може да игнорира опитите ви да спрете опаковането. Това в известен смисъл е нещо добро, тъй като опаковката позволява по-високо ниво на ефективност... Помислете за масив, когато осъществите достъп до елемент 1, той се преминава ефективно до като разстоянието, по отношение на паметта, между елементите са еднакви. Това се извършва и със структури, за да се гарантира запазване на ефективността.

Насочвам ви към това препълване на стека Деактивирайте подпълването на структурата в C без използване на pragma

person Rich Pickering    schedule 25.04.2014

Странно – имам структури в програма на трета страна, които са опаковани на 1-байтови граници и работят според очакванията (макар и да не ми харесва!).

Ако компилаторът игнорира вашите прагми, опитайте да зададете и опциите на компилатора за подравняване - C/C++ | Генериране на код | Изравняване на член на структура към 1.

Ако компилаторът прави оптимизация „Аз знам най-добре“, може би поставянето на char на първо място ще го спре.

person gbjbaanb    schedule 25.04.2014