关于内存对齐

将数据放在内存上时,对于存放数据的地址有对齐的限制。

对齐是指将数据放在内存上时,必须放置在特定数值的倍数的地址上。例如,“必须放置在4的倍数的地址上”。

最近设计的CPU中有着所有的数据都必须放置在该数据大小的倍数的地址上这样的限制。也就是说2字节的数据必须存放在2的倍数的地址上,4字节的数据必须存放在4的倍数的地址上。违反上述限制就会发生总线错误,导致程序异常终止。

另外,某些OS中调用外部函数时的栈帧必须以16字节为边界排列,例如Windows和Max OS X。

将结构体存放在内存上时,其成员的值由前向后依次排列。另外,结构体中各成员有着和各成员的数据类型的大小一样的对齐限制。即2字节的数据必须存放在2的倍数的地址上,4字节的数据必须存放在4的倍数的地址上。这样一来,像下面这样大小不一的成员在排列时就可能形成间隙,这样的间隙称为填充(padding)。

struct s {
    char a;
    char b;
    int c;
}

0到1字节存放a,1到2字节存放b,4到8字节存放c,2到4字节就形成了间隙。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一次开发遇到的内存对齐问题 1.问题描述 在开发的过程中有一个协议头,结构如下: 协议头的长度被定义为了 20 b...
    树林里的小怪兽阅读 388评论 0 0
  • 一、内存对齐的原因 大部分的参考资料都是如是说的: 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任...
    沮溺阅读 626评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,489评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,165评论 1 32
  • 1. 数据的宽度与单位 计算机内部任何数据都被表示成二进制编码形式。二进制数据的每一位(0 or 1)二进制信息的...
    執著我們的執著阅读 2,574评论 0 0