c++不同数据类型所占内存大小:
类型 | 32位 | 64位 |
char | 1 | 1 |
int | 4 | 大多数4,少数8 |
short | 2 | 2 |
long | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
指针 | 4 | 8 |
1,结构体sizeof
一般,结构体sizeof是结构体所有成员大小之和
但是为这里应该为7,但是却为8:
这是因为对于结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。
先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小
然而,在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:
(1)结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
(2)结构体大小必须是最宽基本类型大小的整数倍
上面那个例子中,c1偏移量为0,为自身大小的整数倍,满足条件1。s1偏移量为1,但是s1大小为2,不满足条件1,需要在s1前补1位。i1的偏移量位1+1+2=4,自身大小为4满足条件1.则此时的结构体大小为1+1+2+4=8;且满足条件2,即结构体的大小为8
2,共用体union的sizeof
在结构中各成员有各自的内存空间,而在“联合”中,各成员共享一段内存空间
所以联合体的sizeof:
(1)为所有成员中最长的
(2)结构体大小必须是最宽成员大小的整数倍
这里最长的成员变量大小为d1,如果union长度为13,满足条件1,但是这里最宽的基本类型为int(4),13不是8的倍数,所以需要填充三个,长度为16:
这个union大小就为8
3,枚举的sizeof
enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4