由于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个字节的内存空间。
以上是字节对齐会影响内存访问的效率吗的详细内容。更多信息请关注PHP中文网其他相关文章!