Даже если вы пишете строгий код C
, результаты будут зависеть от компилятора. Используя стратегии из этой ветки, я получил интересные результаты ...
enum_size.c
#include <stdio.h>
enum __attribute__((__packed__)) PackedFlags {
PACKED = 0b00000001,
};
enum UnpackedFlags {
UNPACKED = 0b00000001,
};
int main (int argc, char * argv[]) {
printf("packed:\t\t%lu\n", sizeof(PACKED));
printf("unpacked:\t%lu\n", sizeof(UNPACKED));
return 0;
}
$ gcc enum_size.c
$ ./a.out
packed: 4
unpacked: 4
$ gcc enum_size.c -fshort_enums
$ ./a.out
packed: 4
unpacked: 4
$ g++ enum_size.c
$ ./a.out
packed: 1
unpacked: 4
$ g++ enum_size.c -fshort_enums
$ ./a.out
packed: 1
unpacked: 1
В моем примере выше я не осознавал никакой выгоды от модификатора __attribute__((__packed__))
, пока не начал использовать компилятор C ++.
EDIT:
@ Подозрение технозавра было верным.
Проверяя размер sizeof(enum PackedFlags)
вместо sizeof(PACKED)
, я вижу ожидаемые результаты ...
printf("packed:\t\t%lu\n", sizeof(enum PackedFlags));
printf("unpacked:\t%lu\n", sizeof(enum UnpackedFlags));
Теперь я вижу ожидаемые результаты от gcc
:
$ gcc enum_size.c
$ ./a.out
packed: 1
unpacked: 4
$ gcc enum_size.c -fshort_enums
$ ./a.out
packed: 1
unpacked: 1