枚举大小sizeof中枚举的大小详解

枚举大小sizeof中枚举的大小详解

ID:8851656

大小:41.00 KB

页数:5页

时间:2018-04-09

枚举大小sizeof中枚举的大小详解_第1页
枚举大小sizeof中枚举的大小详解_第2页
枚举大小sizeof中枚举的大小详解_第3页
枚举大小sizeof中枚举的大小详解_第4页
枚举大小sizeof中枚举的大小详解_第5页
资源描述:

《枚举大小sizeof中枚举的大小详解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。根据上面对enum类型的描述,有以下几个问题:1.到底enum所定义出来的类型是一个什么样的类型呢?2.作为一个用户自定义的类型其所占用的内存空间是多少呢?3.使用enum类型是否真的能够起到有限集合常量的边界约束呢?4.大家可能都知道enum类型和int类型具有隐示(自动)转换的规则,那么是否真的在任何地方都可以使用enum类型的变量来代替int类型的变量呢?1.到底enum所定义出来的类型是一个什么样的类型呢

2、?在C++中大家都知道仅仅有两种大的类型分类:POD类型(注(1))和类类型。enum所定义的类型其实属于POD类型,也就是说它会参与到POD类型的隐示转换规则当中去,所以才会出现enum类型与int类型之间的隐示转换现象。那么也就是说enum所定义的类型不具备名字空间限定能力(因为不属于类类型),其所定义的常量子具备和enum类型所在名字空间相同的可见性,由于自身没有名字限定能力,所以会出现名字冲突现象。如:structCEType{enumEType1{e1,e2};enumEType2{e1,e2};};上面的例子会出现e1、e2名字冲突编译时错误,原因就在于枚举子(

3、e1、e2)是CEType名字空间中的名字,同样在引用该CEType中的枚举子时必须采用CEType::e1这样的方式进行,而不是CEType::EType1::e1来进行引用。注(1)POD类型:你可以将POD类型看作是一种来自外太空的用绿色保护层包装的数据类型,POD意为“PlainOldData”(译者:如果一定要译成中文,那就叫“彻头彻尾的老数据”怎么样!)这就是POD类型的含义。其确切定义相当粗糙(参见C++ISO标准),其基本意思是POD类型包含与C兼容的原始数据。例如,结构和整型是POD类型,但带有构造函数或虚拟函数的类则不是。POD类型没有虚拟函数,基类,用

4、户定义的构造函数,拷贝构造,赋值操作符或析构函数。  为了将POD类型概念化,你可以通过拷贝其比特来拷贝它们。此外,POD类型可以是非初始化的。2.作为一个用户自定义的类型其所占用的内存空间是多少呢?该问题就是sizeof(EType1)等于多少的问题,是不是每一个用户自定义的枚举类型都具有相同的尺寸呢?在大多数的32位编译器下(如:VC++、gcc等)一个枚举类型的尺寸其实就是一个sizeof(int)的大小,难道枚举类型的尺寸真的就应该是int类型的尺寸吗?其实不是这样的,在C++标准文档(ISO14882)中并没有这样来定义,标准中是这样说明的:“枚举类型的尺寸是以能

5、够容纳最大枚举子的值的整数的尺寸”,同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型具有相同的尺寸呢?上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的值的整数就可以了,那么就是说可以是char、short和int。例如:enumEType1{e1=CHAR_MAX};enumEType2{e2=SHRT_MAX};enumEType3{e3=INT_MAX};上面的三个枚举类型分别可以用char、short、int的内存空间进行表示,也就是:sizeof(ETy

6、pe1)==sizeof(char);sizeof(EType2)==sizeof(short);sizeof(EType3)==sizeof(int);那为什么在32位的编译器下都会将上面三个枚举类型的尺寸编译成int类型的尺寸呢?主要是从32位数据内存对其方面的要求进行考虑的,在某些计算机硬件环境下具有对齐的强制性要求(如:sunSPARC),有些则是因为采用一个完整的32位字长CPU处理效率非常高的原因(如:IA32)。所以不可以简单的假设枚举类型的尺寸就是int类型的尺寸,说不定会遇到一个编译器为了节约内存而采用上面的处理策略。3.使用enum类型是否真的能够起到有

7、限集合常量的边界约束呢?首先看一下下面这个例子:enumEType{e1=0,e2};voidfunc1(ETypee){if(e==e1){//dosomething}//dosomethingbecausee!=e1muste==e2}voidfunc2(ETypee){if(e==e1){//dosomething}elseif(e==e2){//dosomething}}func1(static_cast(2));func2(static_cast(-1));上面的代码应该很清楚

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。