關於枚舉類型所占內存的大小,書裡對枚舉大小的定義是:sizeof枚舉是sizeof某類可以包含枚舉range的整型,並且不會大於sizeof(int)。也就是說枚舉大小不一定等於sizeof(int)。
比如在一個sizeof(int)等於4的機器上,sizeof枚舉有可能是1或者4,但不會是8 。
要想強制enum等於一個固定長度,就要定義一個最大的長度放入enum定義中。
比如:
typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0,
D3DPOOL_MANAGED = 1,
D3DPOOL_SYSTEMMEM = 2,
D3DPOOL_SCRATCH = 3,
FORCE_DWORD = 0x7fffffff
} D3DPOOL;
根據書裡描述,這個FORCE_DWORD成員的作用就是控制枚舉類型的range,從而強制讓sizeof枚舉為sizeof(FORCE_DWORD)。而這麼做的目的就是為了高效地32位尋址。
但如果如下定義:
enum A
{
a1=0xffffffffffff
};
編譯器就會報錯——“枚舉超出了int范圍”。
但是我在vs中測試發現情況並不是完全像書上所說。如下:
enum A
{
a1=1
};
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d\n",sizeof(a1));//輸出4
}
運行結果是輸出4而不是1。所以我覺的這個實現應該和編譯器有關。
而且:
#pragma pack(1)
enum A
{
a1=1
};
#pragma pack()
輸出a1依然占四個字節。以上說明枚舉類型作為C的標准變量類型,其長度是不受編譯開關影響的,就如char類型無論如何pack,依然是單字節.但是,並非所有的編譯器都遵循C標准,或許是VC不標准,或許是BCB不標准.
所以建議以後用到的變量盡量使用char或int來替代enum,以免帶來不必要的麻煩.