Как Enum разпределя памет на C?

Опитвам се да работя с език C и Assembly (intelx8086).

Аз също използвам един клас, който е внедрен от мой приятел. Има

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

Искам да работя с този клас побитово (известен още като конструиране/унищожаване при сглобяване). Въпросът ми е колко памет отнема enum?


person NacOverflow    schedule 04.09.2012    source източник
comment
В C, същото като int. В C++0x може да бъде повече или по-малко базирано на основния тип.   -  person DCoder    schedule 04.09.2012
comment
възможен дубликат на Какъв е размерът на enum в C?   -  person DCoder    schedule 04.09.2012
comment
Wikipedia има известна информация, свързана с вашата задача.   -  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 пише в асемблиране, но във всяка отделна препратка към тези структури той адресира аритметика въз основа на тази променлива? Струва ми се по-вероятно 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 бита. Модерните вградени системи могат да имат различни размери на char (16 бита, например). Също така не знаем как ще изглеждат архитектурите след 10+ години, така че е най-добре да не предполагаме (или поне да използваме статични твърдения, за да се провалим безопасно). - person sfstewman; 04.09.2012
comment
CHAR_BIT трябва да бъде поне 8; тя може да бъде по-голяма, но не по-малка (5.2.4.2.1, дефинираните от изпълнението стойности трябва да бъдат равни или по-големи по големина (абсолютна стойност) от показаните, със същия знак). - person John Bode; 04.09.2012

Един enum всъщност не отнема никаква памет; разбира се от компилатора и правилните числа се използват по време на компилирането. Това е int, чийто размер зависи от вашата система.

person mah    schedule 04.09.2012