почему размер этой структуры неверен

У меня есть этот пример кода, который я украсил пакетом, чтобы убедиться, что его размер составляет 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
Прочтите о заполнении. ваш вопрос уже имеет более 100 дубликатов только на SO.   -  person Dayal rai    schedule 25.04.2014
comment
C или C++? Есть разница. Пожалуйста, просто выберите тот, который вы используете.   -  person stefan    schedule 25.04.2014
comment
@Stefan Я подаю в суд на С++ на 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: ОП указал, какую реализацию он использует. Это правильный подход. Использование 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