一、什么是内存对齐
内存对齐(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)