您的位置:首页 > 其它

字节对齐与CPU效率和内存占用

2018-01-24 17:26 441 查看
由于C++的项目做的少,又比较小,所以一直没有注意字节对齐的问题,但是,字节对齐在大规模应用中对内存管理和CPU执行效率的影响应是挺大的。本文根据一些资料学习,做一个小总结。

首先抛出第一个结论,字节对齐可以提高CPU的执行效率。

根据(1)中分析,CPU执行指令时从内存中获取数据是按块操作的,块的大小可能为2-bytes, 4-bytes, 8-bytes, 16-bytes……



上图所示4-bytes块,此时,如果CPU读取4-bytes或以上大小的数据的起始地址为1,则需要至少读取2个数据块,然后把2个块中不需要的数据抛弃,再将有用数据拼接成4-bytes的数据,这明显增加了CPU的操作,影响了CPU指令的执行效率。如果CPU读取数据的起始地址在0,4……,则一次只需要读一个数据块,CPU的读取指令就是一次原子操作。

字节对齐就是对CPU读取的每一个数据,都保证其起始地址在数据块的始端,对数据字节数小于CPU数据块(粒度)的值进行扩充,使得其占用完整的一个粒度的内存空间。字节对齐,节省了CPU进行数据截取和拼接的操作。

另一个结论,字节对齐有利于优化内存。

在结构体中,根据字节自动对齐原则,结构体

typedef struct _test {
char a;
int b;
char c;
} test;

编译器将采用结构体中字节数最大的基本类型int的字节数作为对齐标准,char类型将扩充为4-bytes,因此,sizeof(test)=12,但是这样的内存利用效率比较低。

如果通过指定编译器1字节对齐,则CPU的执行效率就会降低。

#praama pack(1)
typedef struct _test { char a; int b; char c; } test;
#pragma pack()

为了保证CPU执行效率的条件下优化程序的内存,需要调整结构体中数据成员的顺序

typedef struct _test {
int b;
char a;
char c;
} test;

此时,结构体成员b占用4个字节,a和c分享后面的4个字节,其中两个成员占用前两个字节,后两个字节为字节对齐时填充的无效数据,此结构体占用8个字节的内存空间。

(1)https://www.ibm.com/developerworks/library/pa-dalign/index.html

(2)https://www.cnblogs.com/huhuuu/p/3439316.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: