sizeof的常见用法
1. 基本类型所占的内存大小
类型 | 32位系统(字节) | 64位系统(字节) |
char | 1 | 1 |
int | 4 | 4 |
short | 2 | 2 |
long | 4 | 8 |
float | 4 | 4 |
double | 4 | 8 |
指针 | 4 | 8 |
上表中是基本类型在不同平台上所占用的内存大小,例如sizeof(int) = 4。
2.sizeof计算数组占用的字节数
使用sizeof计算数组占用内存的字节数的计算方法是 类型字节数*数组长度。
例如:
1 int m_aNums[3]; 2 sizeof(m_aNums);
使用sizeof计算m_aNums的字节数是12。
3.sizeof计算单层结构体的大小
结构体中的成员变量可以是不同类型,是根据声明的顺序依次存入内存。跟数组不同的是,结构体的大小不是成员变量大小的简单相加。
结构体所占内存大小的字节数是由结构体内最后一个成员变量的偏移量+最后一个成员变量的字节大小计算而得的。
计算结构体所占的字节数有两个规则:
(1)每个结构体内成员变量的偏移量必须是该变量大小的整数倍。
(2)计算得到的结构体的大小必须是结构体内每个成员变量大小的整数倍,即结构体大小的值是每个成员变量大小的最小公倍数。
例如:
1 typedef struct { 2 int a; 3 double c; 4 short b; 5 }SA; 6 7 typedef struct { 8 int a; 9 short b; 10 double c; 11 }SB;
结果:sizeof(SA) = 24;sizeof(SB) = 16。
分析:
注意:结构体内每个成员变量的偏移量 = 上一个成员变量偏移量 + 上一个成员变量的大小
SA结构体内:a的偏移量 = 0,a的大小 = 4;
c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能是4,因此4不是c的大小的整数倍,因此c的偏移量必须补上4位变为8)
b的偏移量 = 16,b的大小 = 2;
计算得到结果24,不能是18,因为18不是4和8的最小公倍数,因此最后结果是需要补上6位得到其最小公倍数24。
SB结构体内:a的偏移量 = 0,a的大小 = 4;
b的偏移量 = 4,b的大小 = 2;
c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能6,因为6不是c大小的整数倍,因此补上2位,变为8)
计算得到结果是16。
从SA和SB两个结构体的计算大小可知,结构体内变量声明顺序的不同,会导致结构体所占大小的不同。
4.sizeof计算嵌套结构体的大小
sizeof计算嵌套结构体大小的计算规则:
(1)将嵌入的结构体展开,被展开的结构体的第一个成员变量的偏移量是被展开结构体中最大的成员变量大小的整数倍。
(2)最终计算的结构体的大小必须是所有成员变量大小的整数倍,这里所有成员变量计算的是展开后的变量,而不是将嵌入的结构体作为一个整体。
例如:
struct SC { short i; struct { char c; int j; } ss; int k; }
sizeof(SC) = 16,其中ss.c的偏移量是4,而不是2。