在C++中,使用运算符sizeof可以获得对应对象的大小(以字节为单位)。
基本数据类型大小如下:
type | under 32bit | under 64bit |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4或8 |
long | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
指针 | 4 | 8 |
除了基本数据类型外,还有结构体struct、联合union和枚举enum的情况
sizeof求结构体对象大小
大家都知道,数据在计算机中是以字节为单位存储的,那么理论上来说在任何位置开始存数据都是可以的,但这样做会严重影响存取效率,因此需要字节对齐,来让字节按照一定的规律排列。
关于字节对齐可以看看这篇5分钟搞定内存字节对齐
- 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
- 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
- 收尾工作:结构体的总大小,也就是sizeof的结果。必须是其内部最大成员的整数倍,不足的要补齐。
第一条规则中提到的起始位置受该成员自身大小限制,与动态规划的思维有点类似:从前往后依次添加成员,添加的时候视情形而定在前面填上空字节。
第二条规则是对嵌套结构体成员而言。
前两条原则对应于结构体内部,而第三条原则则是对应外部的情况。通过在最后添上空字节,让整个结构体变量大小符合规律,易于操作,达到字节对齐的目的。
需要注意的是,嵌套结构体中,内部的结构体成员是不作为整体进行考虑的,而是将其展开
sizeof对枚举型变量的处理
枚举实质是创建一组常数,枚举变量则储存这些常数值中的一种。由于默认这些常数是int类型,因此大家都会以为枚举变量大小与int类型相同。
但C标准中的规定是,枚举类型的尺寸只需可容纳其最大枚举子值即可,除此之外并没有限定使用什么类型来存储。
比如有时候char类型或short类型即可容纳枚举中的最大子值,此时编译器便可以使用量体裁衣的策略,将对应枚举变量类型看作char或short类型,以达到节约内存的目的。
也正因为各编译器实现不一,接口库中也极少使用枚举作为参数传递,以避免编译器不同带来的问题发生。