现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐.
为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位)。字节对齐有什么好处?以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了.
通常,我们写程序的时候,不需要考虑对齐问题,编译器会替我们选择适合目标平台的对齐策略。但是,正因为我们一般不需要关心这个问题,所以,如果编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,例如:
//下面我们更换一下成员变量位置,看看有什么效果
那么问题来了,两个结构体的成员变量只是改变了下顺序,为什么占用的内存大小不同呢?
对齐原则:
根据以上原则,我们来分析:
下面分析:
例如:
pragma pack 的用法
attribute ((packed))的用法:
让指定的结构结构体按照 1 字节对齐,例如:
可以看出,默认系统是按照4字节对齐
用packed修饰后,变为1字节对齐,这个常用于与协议有关的网络传输中.
答案是:12
答案是:8
也就是说:两个结构体,仅仅是里面包含的数据类型的位置变了,它的大小就会不一样!
这就是内存对齐的问题,也是编译器帮我们把每一个数据单元安排在了合适的位置。
好吧,内存对齐规则说的太专业,其实说白了就是,在没有 #pragma pack(n) 下,默认都是4字节对齐。
对于st1,char是1字节,相邻的int是4字节,因此1+4>4了,所以char只能单独享用4字节了,同理short也是一样,因此就是4+4+4=12字节。
对于st2,char是1字节,相邻的short是2字节,因此1+2<4,所以char和short可以一起享用4字节了,而int在享用4字节,因此就是4+4=8字节。
晦涩的专业语言把道理精简再精炼,而白话文却能把道理婵婵道来,不得不说,语言的神奇。
出差必备:
买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP, 点击注册
优惠购物:
你还在傻傻的原价淘宝吗?来这里领取内部优惠券,折扣力度非常大! 点击注册 ,注册需要邀请码UWD9Q9E。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)