一、什么是内存对齐
内存对齐(Memory alignment),也叫字节对齐。
现代计算机中内存空间都是按照 byte 区分的,从理论上讲似乎对任何类型的变量的拜访能够xcode怎样运转c++程序从地址开始,但实践情况是在拜访特定类型变量的时分经常在特定的内存地址拜访,这就需求各种类型数据按架构图照必定的规矩在空间上摆放,而不是次第的一个接一个的排放,这便是安全对齐。
举一个简略的比方, 64位体系,int所占内存架构图用什么软件做空间为 4 bytes,char为 1 byte。假定把它们放在一个结构体中,则所占的内存空间应该是 4 + 1 = 5 bytes 。而数组初始化事实上,在Xcode环境,sizeof 操作的作用都是 8 bytes:
二、为什么要进行内存对齐
之所以要内存对齐,有两方面的原因:
途径原因:各安全教育个硬件途径对存储空间的处理上有很大的不同。一些途径对某xcode是什么些特定类型的数据只能从某些特定地址开始存取。比方,有些架构的CPU在拜访一个没数组指针有进行对齐的变量的时分会发生过错,那么在这种架构下编程有必要保证源码编辑器编程猫字节对齐。
功用原因:内存对齐能够进架构图用word怎样做出来的步存取功率。比方,有些途径每次读都是从偶地址开始,假定一个int型(假定数组排序为32位体系)假定寄存在偶地址开始的当数组去重地,那么一个读周期就能够读出这32bit,而假定寄存在奇地址开始的当地,就需求2个读周期,并对两次读出的作用的高低字节数组指针进行拼凑才干得到该32bit数据。
三、内存对齐的准则
1.数据成员对齐规矩:结构(s架构师truct)(或联合(union))的数据成员,第一个数据成员放在offset为0的当地,往后每个数据成员存储的开始方位要从该成员巨细或许成员的子成员巨细(只需该成员有子成员,比方说是数组,结构体等)的整xcode病毒检测工具数倍开始(比方int在 32 位机为4字节,则要从4的整数倍地址开始存储,再比方short在 32 位机为2字节,则要从xcode是什么2的整数倍地址开始存储)。
2.结构体作为成员:假定一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大xcode是什么软件小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3.收数组的界说尾作业:结构体的总巨细,也便是sizeof的作用,有必要是其内部最安全教育大成员的整数倍.短少的要补齐。
字节表
四、内存对齐底层探求
首要为什么要探索结构体内存对齐呢?由于看xcode是什么软件objc数组函数的使用方法源码会发现万物皆目标的基础是个结构体,当我源码们创立目标的时分,不需求去注意特色的先后次第,由于体系会主动帮咱们处理,可是当咱们创立结构体的时分就需求咱们去剖析了,由于体系不会主动给咱们优化,
先来看下下面两个结构体架构图模板(无嵌套)
s安全教育truct LGStruct1{
double a; // 8
int b; // 4
short c; // 2
char d; // 1
}LGStruct1;
struct LGStruct2{
double a; // 8
cha架构师需要掌握哪些常识r d; // 1
int b; // 4
short c; // 2
}LGStruct2;
咱们声明以上两个结构体,两个结构体具有的数据类型数组c言语是一摸摸相相同的,理论上内存巨细也应该相同(内存是不是真的相同大呢?),然后先看下以下代码
-----1源码网站6-----24
那么就有问题了,为什么相同的数据类型,里边特色个数也是相同的,可是占用的空间巨细不相同呢?这便是今天的要点,结构体内存对齐准则(上面第三点)
下面源码交易网站源码就依据内存对齐准则进行简略的计算和剖析架构师和程序员的差异
LGStruct2内存巨细具体进程(min(m,n) m标明当前开始的方位,n标明巨细)
变量a: 占8个字节,offert从0开始, min(0,8), 即0 ~ 7 寄存a
变量b: 占4个字节,offert从8开始(12能够整除数组的界说4), min(8,4), 即8 ~ 11 寄存b
变数组公式量c: 占2个字节,offert从12开始(12能够整除2),min(12,2),即12 ~ 13 寄存数组c言语c
变量d: 占1个字节,offert从14开始(14能够整除1),min(14,1),即14 寄存d
作用闪现 LGStruct1 的实践的内存巨细架构师和程序员的差异是15字节,LGStruct1中最大的变量是a占个 8 字节。所以LGStruct1的实践内存巨细有必要是8的整数倍,15不是8的整数倍,向上取整,短少的主动补齐为16字节。毕竟LWStruct1的内存巨细为16字节安全标语。
LGStruct1解析图如下
LGS安全期计算器truct2内存巨细具体进程
变量a: 占8个字节,offert从0开始, min(0,8), 即0 ~ 7 寄存a。
变量d: 占1个字节,off架构师需要掌握哪些常识ert从8开始(8能够整除1), min安全出产月(8,1), 即8 寄存d。
变量b: 占4个字节,offert从9开始(9不能够整除4), min(9,4),9 % 4 != 0,继续往后移动直到找到能够整除4的方位 12 即1架构师2 ~ 15 寄存b。
变量c: 占2个字节,offert从1xcode怎样编写c言语6开始(16能够整除2),mxcode怎样运转c++程序in(16,2),即16 ~架构设计 17 寄存c。
作用闪现 LGS数组函数的使用方法truct2 的实践的内存巨细是18字节,LGStruct2中最大的变量是a占个 8 字节。所以LGStruct2的实践内存巨细有必要是8的整数倍,18不是8的整数倍,向上取整,短少的主动补齐为24字节。毕竟LGStruct2的内存巨细为24字节。源码编辑器
LGStruct2解析图如下
结构体中嵌套结构体
struct LGStruct1{
double a; // 8
int b; // 4
short c; // 2
char d; //源码交易网站源码 1
}LGStruct1;
struct LGS数组词truct2{
double a; // 8
ch数组的界说ar d; // 1
int b; // 4
short源码时代培训怎样样 c; // 2
}LGStruct2;
struct LGStr数组公式uct3{
long a; // 8
int b; // 4
short c; // 2
char d; // 1
str源码uct LGStruct安全教育2 lwStr;
}LGStruct3;xcode教程
int main(in数组词t argc, char * argv[]) {
@autoreleasepool {
NSLog(@"-----%lu-----%lu----%lu",sizeof(LGStruct1),sizeo数组的界说f(LGStruct2),sizeof(LGStruct3));
}
return 0;
}
打印的作用
-----16-----24----40
LGStruct3内存巨细具体进程
变量a: 占8个字节,offert从0开始源码编辑器, min(0,8), 即0 ~ 7 寄存a
变量b: 占4个字节,offert从8开始(8能够整除4), min(8,4), 即8 ~ 11 寄存b
变量c: 占2个字节,offert从数组去重12开始(12能够整除2),min(12,2),即12 ~ 13 寄存c
变量d: 占1个字节,offert从14开始(14能够整除1),min(14,1),即14 寄存d
变量lwStr:lwStr是结构体变量,内存对齐准则结构体成员要从其内部的最大元素巨细的整数倍安全期计算器地址开始存储。LGStruct2 中的最大的变量占8字节,所以offert从16开始,LGStruct2的内存巨细是18字节。min(16,18),即18 ~ 33寄存 lwStr
作用闪现 LGStruct3 的实践的内存架构师巨细是34字节,LGStruct3中最大的变量是lwStr和 a都是 8 字节数组初始化。所以LGStruct3的实践内存巨细有必要是8数组指针的整数倍,34不是8的整数倍,向上取整,短少的主动补齐为40字节。毕竟LGS安全出产月truct3的内存巨细为40字节。
LGSTruct3解析图如下
五、总结
1、简略xcode是什么软件的结构体:第⼀个数据成员放在offset为0的地⽅,往后每个数据成员存储数组去重的开始方位要从该成员⼤⼩的整数倍 开始存储。
2、有嵌套结构体的结构安全期是哪几天体:则嵌套的结构体成员要从其内部最⼤元素⼤⼩的整数倍地址数组和链表的差异开始数组排序存储。
3、结构体的总⼤⼩,有必要是其内部最⼤成员Xcode巨细的整数倍,不⾜的要补全。
内存对齐有拟定了一套规矩,目的是前进cpu的存取功率和安全的拜访。字节对齐或许浪费了部分内存,可是一同进行内存优化尽或许的降安全出产月低了内存的浪费,即保证了存取的速率,又减少了内存的浪费,不得不说真的很优异啊。







评论(0)