Как Enum выделяет память на C?

Я пытаюсь работать с языком C и ассемблера (intelx8086).

Я также использую один класс, который был реализован моим другом. Оно имеет

typedef enum data_10 {a=0,b=7,c=10,} data_10_type;

Я хочу работать с этим классом побитно (AKA построить/уничтожить его на сборке). Мой вопрос в том, сколько памяти занимает перечисление?


person NacOverflow    schedule 04.09.2012    source источник
comment
В C так же, как int. В C++0x это может быть более или менее основано на базовом типе.   -  person DCoder    schedule 04.09.2012
comment
В В Википедии есть некоторая информация, относящаяся к вашей задаче.   -  person NovaDenizen    schedule 05.09.2012
comment
C не имеет классов, по крайней мере, не как первоклассная функция языка. Может быть, вы имеете в виду структуру с членом этого типа data_10_type?   -  person Peter Cordes    schedule 07.02.2021


Ответы (3)


Хотя это может варьироваться от компилятора к компилятору, enum обычно имеет тот же размер, что и int. Однако, чтобы быть уверенным, вы всегда можете использовать sizeof( data_10_type );

person Greyson    schedule 04.09.2012
comment
Это покажет вам размер одной конкретной версии одного компилятора на одной архитектуре. Это не рассчитано на будущее. - person NovaDenizen; 05.09.2012
comment
@NovaDenizen Только в том случае, если вы распечатаете его один раз и будете использовать навсегда. Лучше сохранить его в переменной и использовать ее для распределения. - person Greyson; 05.09.2012
comment
@Greyson Итак, ОП пишет на ассемблере, но в каждой ссылке на эти структуры он обращается к арифметике на основе этой переменной? Мне кажется более вероятным, что OP хочет окончательно узнать расположение байтов полей в структуре, но эта информация не существует вне контекста одной версии компилятора. - person NovaDenizen; 07.09.2012

Почему бы вам не напечатать его?

/* C99 */
#include <stdio.h>

typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type));

Идентификаторы в списке перечислителя объявляются как константы типа int (C11 §6.7.2.2 Спецификаторы перечисления), поэтому sizeof(data_10_type) часто равно sizeof(int), но это не обязательно!

Кстати, если вы хотите иметь размер в битах, просто используйте константу CHAR_BIT (определенную в <limits.h>), которая указывает, сколько битов содержится в одном байте).

/* C99 */
#include <limits.h>
#include <stdio.h>

typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type) * CHAR_BIT);
person md5    schedule 04.09.2012
comment
в каких случаях CHAR_BIT отличается от 8? - person Dirk; 04.09.2012
comment
Стандарт говорит, что CHAR_BIT больше 8. Например, в DSP CHAR_BIT часто равно 16. - person md5; 04.09.2012
comment
@Dirk: нет гарантии, что CHAR_BIT будет равен 8. Исторически байты были 6, 7 и 8 битами. Современные встроенные системы могут иметь разные размеры символов (например, 16 бит). Мы также не знаем, как будут выглядеть архитектуры через 10 с лишним лет, поэтому лучше не делать предположений (или, по крайней мере, использовать статические утверждения для безопасного отказа). - person sfstewman; 04.09.2012
comment
CHAR_BIT должно быть не менее 8; оно может быть больше, но не меньше (5.2.4.2.1, значения, определяемые реализацией, должны быть равны или больше по величине (абсолютное значение) показанным с тем же знаком). - person John Bode; 04.09.2012

Перечисление вообще не занимает памяти; это понимается компилятором, и правильные числа используются во время компиляции. Это int, размер которого зависит от вашей системы.

person mah    schedule 04.09.2012