sizeo(结构体)的大小问题
先来看下面的示例代码:
struct Demo
{
int a;
int b;
};
int main()
{
cout<<"Demo size = " << sizeof(Demo)<<endl;
return 0;
}
毫无疑问,都会说,结果为 8
这时我提出一个问题?请问在32位和64位PC机上分别是多少,或许有些人就有些迷茫了。
实际上都等于 8,这时候可能有些人更加疑惑了
实际上 int 型数据在32位/64位都只占用4字节
下面我们再看一个例子:
struct Demo
{
int* a;
};
int main()
{
cout<<"Demo size = " << sizeof(Demo)<<endl;
return 0;
}
直接上结果:
我们会惊奇的发现 对于int型指针,32位占4字节,64位占8字节,希望大家可以谨记这一点。
那么试问,如果将结构体里的 int* a 改为 char* a,那么结果优势如何?
哈!结果居然运行一样
struct Demo
{
char* a;
};
int main()
{
cout<<"Demo size = " << sizeof(Demo)<<endl;
return 0;
}
是不是和大家想的不太一样呢?
其实指针默认情况下是int型指针
接下来可能就是面实中经常遇到了问题,给你一个结构体,那你计算出他占用的内存。(以下都是在32位机上所占用内存)
struct Demo
{
char a;
int b;
};
初学编程的人会说等于5,1+4 = 5 那么我们看看运行结果
很多人会表示惊讶,为什么是8呢?
实际上这里存在一个内存对齐的原因。
- 首先 char 是 1 字节 int 是 4 字节,但是对于32位机,如果char 后面接着放 int 型的数据话,会有一个字节的数据会令其一行存放,这样会造成 int 型数据需要读取俩次才能被读取,所以采用内存对齐原则,另起一行存放 int 型数据。
具体关于内存对齐原则,会在接下来的博客中提到。
这里给出一些规则总结,希望对大家有帮助:
- char 1字节 int 4字节 double 8字节 int* 4字节
- 首先看一个结构体中最大占用数据类型是几个字节,
- 那么就是以这个字节数位对齐字节数,将结构体中各个数据依次排放,当放不下(出现一个数据需要放两行)的情况就令其一行放
- 最终的占用内存一定是最大数据占用字节的整数倍