您的位置 首页 技术

字节对齐会影响内存访问的效率吗

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

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

首先抛出第一个结论,字节对齐可以提高CPU的执行效率。 (推荐学习:phpstorm)

CPU执行指令时从内存中获取数据是按块操作的,块的大小可能为2-bytes, 4-bytes, 8-bytes, 16-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个字节的内存空间。

以上就是字节对齐会影响内存访问的效率吗的详细内容,更多请关注24课堂在线网其它相关文章!

本文来自网络,不代表24小时课堂在线立场,转载请注明出处:https://www.24ketang.cn/23640.html

为您推荐

返回顶部