字节对齐与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进行数据截取和拼接的操作。
另一个结论,字节对齐有利于优化内存。
在结构体中,根据字节自动对齐原则,结构体
编译器将采用结构体中字节数最大的基本类型int的字节数作为对齐标准,char类型将扩充为4-bytes,因此,sizeof(test)=12,但是这样的内存利用效率比较低。
如果通过指定编译器1字节对齐,则CPU的执行效率就会降低。
为了保证CPU执行效率的条件下优化程序的内存,需要调整结构体中数据成员的顺序
此时,结构体成员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
首先抛出第一个结论,字节对齐可以提高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
相关文章推荐
- C/C++基本数据类型占用字节数及内存字节对齐
- C语言结构体类型占用的内存空间,需要考虑字节对齐
- c语言结构体类型占用的内存空间,需要考虑字节对齐
- 再谈 内存对齐补齐--提高cpu检索周期效率
- [面试] 结构体占用空间的问题,内存对齐~! 真的懂了,cpu取加快速度,省空间来考虑。
- [面试] 结构体占用空间的问题,内存对齐~! 真的懂了,cpu取加快速度,省空间来考虑。
- 语言 内存中结构体字节对齐
- Ubuntu查看系统资源占用(内存,cpu和进程)
- 也谈字节对齐带来效率的差异
- w3wp.exe占用CPU和内存问题
- 数据库学习1——MySQL占用内存与CPU过高测试与解决办法
- Unity Assetbundle的加载方式的效率和内存占用
- C++:struct和union 内存字节对齐问题
- Linux 多线程调试(内存占用、死循环、CPU占用率高……)
- 5分钟搞定内存字节对齐
- Linux TOP命令 按内存占用排序和按CPU占用排序
- Linux下如何查看哪些进程占用的CPU内存资源最多
- 使用psutil库监控linux的系统资源和自定义进程的cpu 内存占用。
- struct/class等内存字节对齐问题详解
- 从CPU角度看内存访问对齐