C/C++之内存对齐

来源:互联网 发布:js埋点代码收集脚本 编辑:程序博客网 时间:2024/06/16 22:50

1、什么是内存对齐

计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小
#include <stdio.h>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$ ./sizeofsize 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 <stdio.h>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 <stdio.h>#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倍的开头
原创粉丝点击