对齐方式.docVIP

  • 10
  • 0
  • 约3.26千字
  • 约 4页
  • 2017-03-19 发布于天津
  • 举报
对齐方式.doc

对齐方式为什么会有内存对齐在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。在缺省情况下,C编译器为每一个变量或数据单元按其自然对界条件分配空间字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常(#GP)。双四字的自然边界是能够被16整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。影响结构体的sizeof的因素: 1) 不同的系统(如32位或16位系统):不同的系统下int等类型的长度是变化 的,如对于16位系统,int的长度(字节)为2,而在32位系统下,int的长度为4;因此如果结构体中有int等类型的成员,在不同的系统中得到的sizeof值是不相同的。 2) 编译器设置中的对齐方式:对齐方式的作用常常会让我们对结构体的sizeof值感到惊讶编译器默认都是8字节对齐 对齐: 为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统)Type Alignment Char 在字节边界上对齐 short 16-bit 在双字节边界上对齐 int and long 32-bit 在4字节边界上对齐 Float 在4字节边界上对齐 Double 在8字节边界上对齐 Structures 单独考虑结构体的个成员,它们在不同的字节边界上对齐, 其中最大的字节边界数就是该结构的字节边界数。 MSDN原话:Largest alignment requirement of any member 理解结构体的对齐方式有点挠头,如果结构体中有结构体成员,那么这是一个递归的过程。对齐方式影响结构体成员在结构体中的偏移设编译器设定的最大对齐字节边界数为n,对于结构体中的某一成员item,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值也就是它相对于结构首地址的实际字节对齐数目X应该满足以下规则X min n, sizeof item 实际上,1字节边界对齐也就表示了结构成员之间没有空洞。例如,对于结构体struct char a; int b T; 当位于32位系统,n 8时:a的偏移为0,b的偏移为4,中间填充了3个字节, b的X为4; 当位于32位系统,n 2时:a的偏移为0,b的偏移为2,中间填充了1个字节,b的X为2;字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间3 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 例如:32位系统,n 8, 结构体 struct char a; char b; T; struct char a; int b; T1; struct char a; int b; char c; T2; sizeof T 2; N 1 没有填充; sizeof T1 8; N 4 中间填充了3字节 sizeof T2 12; N 4 中间,结尾各填充了3字节例如: struct S1 char a; long b; ; struct S2 char c; struct S1 d; long long e; ; sizeof S2 24; 分析根据上面的分析sizeof s1 8; S2 中c和S1中的a一样按1字节对齐而d 是个结构它是8个字节它按什么对齐呢对于结构来说它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个S

文档评论(0)

1亿VIP精品文档

相关文档