Rumah >masalah biasa >字节对齐会影响内存访问的效率吗

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

(*-*)浩
(*-*)浩asal
2019-12-26 09:27:175755semak imbas

由于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个字节的内存空间。

Atas ialah kandungan terperinci 字节对齐会影响内存访问的效率吗. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn