对齐原因

为了访问未对齐的内存,处理器需要做两次内存访问。而对齐的内存只需做一次内存访问。 一个字或双字操作数跨越了4 字节边界,或者一个四字操作数跨越了8 字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常。双四字的自然边界是 能够被16 整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。

对齐原则

  • 但是不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64…中的一个。
  • 每个成员分别按自己的方式对齐,并能最小化长度。
  • 复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。然后,对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
  • 自定义对齐边界时:每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是n 字节)中较小的一个对齐

编译器对齐

缺省情况下,编译器默认将结构、栈中的成员数据进行内存对齐。

自定义对齐

#pragma pack 的用法:
#pragma pack(push) //保存当前对齐方式到packing stack
#pragma pack(push,n) 等效于
#pragma pack(push)
#pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按n 字节对齐。
#pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐。
posted on 2017-11-07 09:25  红孩儿你好  阅读(233)  评论(0编辑  收藏  举报