为什么要对齐
计算机在存取数据的时候是需要依靠总线的。无论是数据总线,地址总线,或是控制总线……,只要是总线,总会有线宽的。即,一次可以传输多少位的二进制信号。
而程序总是要输入输出的,输入输出的交互跟数据总线是分不开的。显然,数据总线越宽,CPU与缓存,内存,输入输出设备之间一次出传输的数据越多,数据传输的速度自然越快。
从缓存或是内存中读取数据的时候,假如现在想要读的是个int型变量,4字节,32位,存放地址0x00000000 到 0x00000003。那么,对于32的数据总线是可以一次全部读出来的。但是前提是这个int变量存放的地址对齐的。设想如果存放的地址是0x00000001 到 0x00000004,那就没办法一次读出来了,只能分两次读。而且还要将第一次读出来的后三个字节跟第二次读出来的第一个字节拼起来。一个简单的读操作变得如此复杂。
因而,为了能够快速的读写,加快程序的运行,数据的内存对齐是必不可少的。如何对齐
根据上面的描述,对齐的目的就是用尽量少的读操作完成读入一个数据。而实际的操作中,系统往往通过
地址%(min(总线宽度,数据结构大小)) == 0
来寻找对齐地址。
考虑总线宽度为8字节,如果对于char类型而言,由于 min(8, 1) == 1,任何地址都是对齐的。而对于int类型而言,由于其为4字节,0x00000001这样的地址便不是对齐的。
但是转念一想,在0x00000001地址上存着一个int变量,也是可以只由一次读操作把这个变量读出来的。一次读出的地址范围是0x00000000 到 0x00000007,而short变量在0x00000001 到 0x00000005的地址上。但是,读出的足有8个字节,要取其中的4个字节,还是要进行读操作的。把值读入到寄存器后,最方便的还是自然是利用eax寄存器的ah跟al来读。如果ah或是al读出的4个字节不能包括这个int变量,那便仍然要进行读两次然后拼接。
浅析内存对齐
最新推荐文章于 2022-12-26 17:33:01 发布