C/C++之内存对齐详情
程序员文章站
2022-04-12 21:54:57
1、什么是内存对齐
计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小
#include...
1、什么是内存对齐
计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小
#include struct A { char a; int b; }; int main() { printf("size of struct A is %d\n", sizeof(struct A)); return 0; }结果:
1111deMacBook-Pro:digui a1111$ ./sizeof size of struct A is 8结果是8,不是5,是由于内存对齐导致
1:a
2
3
4
5:b
6
7
8
2、为什么要内存对齐牺牲了空间,加快cpu寻址速度,加快读取内存数据速度。
内存是以字节为单位,但处理器不是以字节块来存取,一般用双字节,四字节,8字节,16字节,或者32字节来存取内存,这些存取单位为内存存取粒度
比如没有内存对齐,用4字节存取粒度, int变量放在地址为1的地方,我们从0地址开始读区数据,第一个读区范围是0到4,但是这事后没有读完,有效地址还有,4到5,然后第二次,读区从4到8,然后把2块有效数据合并放入寄存器,需要做很多工作,如果有内存对齐,从0地址开始存储,可以一次性读完,不需合并数据,所以加快了效率,
3、用#pragma pack(n)对内存不对齐加入内存对齐
#include struct A { int a; char b; char c; }; struct B { char a; int b; char c; }; int main() { printf("size of struct A is %d\n", sizeof(struct A)); printf("size of struct B is %d\n", sizeof(struct B)); return 0; }结果分别是:
8 12
然后用#pragma pack(n)处理内存不对齐,比如我们用#pragma pack(1)
#include #pragma pack(1) struct A { int a; char b; char c; }; struct B { char a; int b; char c; }; int main() { printf("size of struct A is %d\n", sizeof(struct A)); printf("size of struct B is %d\n", sizeof(struct B)); return 0; }结果都是
6 6
如果用#pragma pack(2)
结果就是
6 8
我们可以这样理解,pack(n),结构体的成员变量的首地址可以是n倍的开头