在C++的课上,老师讲解了关于 sizeof() 的一些规律,先说总结如下:
1.每个变量在内存中的位置一定是其字节大小的整数倍
2.结构体整体字节大小一定是该结构体中最大的字节变量的整数倍
3.不能存放变量的字节位置时自动填充该位置
4.结构体整体字节大小不是该结构体中最大的字节变量的整数倍时往后填充使其成为整数倍
先来几个例子
代码 1
#include <iostream>
using namespace std;
struct A
{
int a;
char b;
};
int main()
{
A exampleA;
cout << "结构体exampleA的字节大小为:"<<sizeof(exampleA) <<endl;
return 0;
}
运行结果
结构体exampleA的字节大小为:8
这里我们可以看到 int a的字节是4,char b的字节是1,在结构体中整体却是8,这里我们看规律的第2条:结构体整体字节大小一定是该结构体中最大的字节变量的整数倍,第4条:结构体整体字节大小不是该结构体中最大的字节变量的整数倍时往后填充使其成为整数倍,如图解释:
由图可以看出,位置4也是char b(字节1)大小的整数倍,所以b占了第4个位置。但这时候结构体整体字节大小5不是该结构体中最大字节变量 int a (即4)的整数倍,所以由第4条规律可得5、6、7位置被自动填充,这时该结构体的字节大小是8而不是5
代码2
#include <iostream>
using namespace std;
struct A
{
int a;
char b;
double c;
int e;
};
int main()
{
A exampleB;
cout << "结构体exampleB的字节大小为:"<< sizeof(exampleB) <<endl;
return 0;
}
运行结果
结构体exampleB的字节大小为:24
同样我们用图来解释:
和第一个例子一样,由图看出 int a(字节4)是0的整数倍,放在第1个位置,位置4是 char b(字节1)整数倍,所以 char b放在第4个位置,注意:这里5、6、7位置被填充的原因并不是和第一个例子一样,而是第1条规律:每个变量在内存中的位置一定是其字节大小的整数倍 和第3条规律:不能存放变量的字节位置时自动填充该位置,因此5、6、7位置不是double b(字节8)的整数倍所以被自动填充了,到第8位置放double c(字节8),第16个位置是 int e(字节4)的整数倍,放 int e,之后4个位置原因就和第一个例子一样了:结构体整体字节大小不是该结构体中最大的字节变量的整数倍时往后填充使其成为整数倍,20个字节不是double c(字节8)的整数倍,填充4个变成24个就是8的整数倍了
这就是老师在上课时讲解的关于sizeof()的一些知识,希望对大家有所帮助~~~