2014-04-25 3 views
2

У меня есть этот образец кода, который я украсил пакетом, чтобы убедиться, что его размер равен 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.

+3

Подробнее о [Padding] (http://stackoverflow.com/questions/6968468/padding-in-structures-in-c). ваш вопрос уже содержит более 100 дубликатов только на SO. –

+0

'C' или' C++ '? Есть разница. Пожалуйста, просто выберите тот, который вы используете. – stefan

+0

@Stefan Я слушаю C++ на визуальной студии. – mans

ответ

7

Ваш синтаксис Прагма неправильно.

Попробуйте это:

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

Demo.

+1

+1: Наконец, здравый и правильный ответ. –

+1

Это не гарантируется для работы во всех реализациях – pmg

+0

@pmg: ОП указывает, какую реализацию он использует. Это правильный подход. Использование 'char [N]' откровенно смешно. –

0

Я считаю, что компилятор разрешается игнорировать pack прагму; возможно, его можно переопределить с помощью компиляторов.

+0

«Разрешено» в каком смысле? Стандарт даже не определяет эту прагму. –

+0

@ Бои в гонке на орбите Ну, что лучше. – Codor

0

Компилятор всегда может игнорировать ваши попытки остановить упаковку. Это, в некотором роде, хорошо, так как упаковка позволяет повысить уровень эффективности. Подумайте о массиве, когда вы обращаетесь к элементу 1, он эффективно перемещается как расстояние, с точки зрения памяти, между элементы равномерны. Это также выполняется со структурами, чтобы обеспечить эффективность.

Я направляю вас к этому переполнение стека Disable structure padding in C without using pragma

0

Strange- У меня есть структуры в сторонней программе, которые упакованы на 1-байтные границы, и они работают как ожидалось (хотя и не понравилось!).

Если компилятор игнорирует ваши прагмы, попробуйте установить параметры компилятора выравнивания, а также - C/C++ | Создание кода | Struct Member Alignment - 1.

Если компилятор выполняет оптимизацию «Я знаю лучше», возможно, сначала помещает символ char, чтобы остановить его.

Смежные вопросы