内存对齐
程序员文章站
2022-05-29 08:06:47
...
概念:是一个数据类型所能存放的内存地址的属性又称字节对齐。如一个数据类型的内存对齐为8时,这个数据类型所定义出来的所有变量其内存地址都是8的倍数。
自然对齐:对齐属性和数据类型的大小相等,如4字节大小的int型数据默认它的字节对齐也是4。
目的:内存对齐可以提高CPU读取内存的效率。(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),如一个int放在奇数内存位置上,想把这4个字节读出来,32位CPU就需要两次,但对齐之后一次就可以了。
-
对齐方式
对于结构体来说,默认的对齐将等于其中对齐最大的成员的对齐值。
-
测试
#include <iostream> using namespace std; struct ts { char a; // 1 byte int b; // 4 bytes short c; // 2 bytes long long d; // 8 bytes char e; // 1 byte }; int main(int argc, char *argv[]) { cout << sizeof(ts) << endl;//32 return 0; }
64 位机,可以按8字节对齐
32 位机,在gcc + 32位linux中,大小超过4字节的基本类型仍然按4字节对齐
-
对齐原则
- 数据成员对齐原则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
- 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)
- 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
推荐阅读
-
docker启动elasticsearch时内存不足问题及解决方法
-
内存管理(上)
-
mysql中内存的使用与分配_MySQL
-
在一个div里面嵌套1个labal和2个div,如何用css实现:labal和第一个div显示在一行,第2个div显示在第2行,并且和第1个div左对齐?_html/css_WEB-ITnose
-
Spark MemoryManager内存模型
-
win10专业版虚拟内存怎么设置 虚拟内存设置成8g的操作步骤
-
PHP大批量数据操作时临时调整内存与执行时间的方法
-
CDR段落文字如何快速对齐?
-
cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题
-
css实现两端对齐~_html/css_WEB-ITnose