将晦涩难懂的技术讲的通俗易懂
分类: C/C++
2014-05-22 18:24:37
关于枚举类型所占内存的大小,书里对枚举大小的定义是: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,以免带来不必要的麻烦.