一、数据对齐/内存对齐
字、双字、四字在自然边界上不需要在内存中对齐。(什么叫做字?见第二部分)
对字、双字、四字来说,自然边界分别是偶数地址、可以被4整除的地址、可以被8整除的地址。
无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;然而,对齐的内存仅需要一次访问。
未对齐的:一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,需要两次总线周期访问内存。
对齐的:一个字起始地址是奇数但却没有跨越字边界被认为的对齐的,能够在一个总线周期中被访问。
缺省情况下,编译器默认将结构、栈中的成员数据进行内存对齐。
对齐的三个规则:
1. 每个成员分别按自己的方式对齐;
2. 复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式。(相当于把复杂类型展开)
3. 对齐后的长度必须是成员中最大的对齐参数的整数倍。(保证在处理数组时每一项都边界对齐)
例子1. 对于如下结构
struct TestStruct1
{
char c1;
short 2;
char c2;
int I;
};
假设c1的地址为0,则c1为00000000,s为00000002,c2为00000004&#x