2012-03-12 2 views
0

Im не "что" новое для C, но может кто-нибудь пожалуйста, просветите меня на этом одном:Sizeof Struct против SIZEOF Тип

printf("%d %d\n", sizeof(int), sizeof(unsigned char)); 

печати, как ожидается, 4 и 1.

typedef struct 
{ 
    int a; 
    unsigned char b; 
} test 

printf("%d\n", sizeof(test)); 

печати 8 ... Я действительно смущен!

+2

http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding – Mysticial

ответ

1

Его название «alignment». Ваш struct дополнен. Вы можете «pack» он (разные компиляторы имеют разные способы определения того, какой тип должен быть упакован), а затем он не будет выровнен, но вы можете столкнуться с проблемами доступа к данным во время выполнения.

+0

Вы бы рекомендовали всегда упаковывать данные в 1 байт, чтобы оптимизировать размер или использовать по умолчанию для компилятора для целей производительности? – McBob

+0

@McBob, нет, наоборот, никогда не упаковывайте, если вы не уверены, что вам это нужно, и вы точно знаете, что делаете. Компилятор использует значения по умолчанию для системы, которые при игнорировании могут ухудшить производительность, а в некоторых системах - сбои. – littleadv

+0

Я работаю над сетевым протоколом и размером заголовка каждой команды протокола должен быть статичным, в этом случае я должен застраховать, чтобы размер остался прежним на каждой платформе? Итак, в этом случае я должен правильно использовать упаковку для структуры заголовка? – McBob

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