内存对齐的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,请问这两次内存访问怎么解释?能够举个具体的例子?
ringa_lee
借回答这个问题的机会,自己也好好温习一下基础知识。切入正题:
首先,明白基础概念:
内存对齐,通常也称为数据对齐,是计算机对数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常使2、4或8)的倍数。
其次,理解数据对齐的目的:
这种对齐限制简化了处理器与存储器系统之间接口的硬件设计。
目前,主要软硬件厂商的观点:
无论是否对齐,IA32等硬件都能正常工作,但建议要对齐数据以提高存储器系统的性能。
目前,主流操作系统的的对齐策略:
linux系统2字节数据类型(例如short)的地址必须是2的倍数,而较大的数据类型(例如int、int*、float和double)的地址必须是4的倍数; windows系统的策略则更严格,任何K字节基本对象的地址都必须是K的倍数,K=2, 4, 8。特别对于一个double或者long long类型数据的地址应该是8的倍数。
最后,给出2个小的示例,假设一个处理器与存储器的接口(数据总线)是8字节(即64位),即处理器每次读取/写入的最小单元是8个字节。
示例1:存储一个double变量 i 上图中的未对齐部分,导致本来一次的存储器操作(0,7),变为2次(0,7), (8,15)。
示例2:存储一个结构体变量
struct s { int i; char c; int j; };
上图中为了数据对齐,会在存储结构体的时候进行填充。对于不同的数据结构,填充的方式不同,有的是在中间部分填充,有的是在末尾部分填充,都是为了保证对齐。需要注意的是,对于这种结构体填充,不仅要保证结构体内部数据类型的对齐,还要保证整个结构体的对齐。
PS: 最后推荐一本值得仔细读读的书:深入理解计算机系统(原书第2版),以上的引用部分,也是引用自这本书里面的内容。
借回答这个问题的机会,自己也好好温习一下基础知识。切入正题:
首先,明白基础概念:
其次,理解数据对齐的目的:
目前,主要软硬件厂商的观点:
目前,主流操作系统的的对齐策略:
最后,给出2个小的示例,假设一个处理器与存储器的接口(数据总线)是8字节(即64位),即处理器每次读取/写入的最小单元是8个字节。
示例1:存储一个double变量 i
上图中的未对齐部分,导致本来一次的存储器操作(0,7),变为2次(0,7), (8,15)。
示例2:存储一个结构体变量
上图中为了数据对齐,会在存储结构体的时候进行填充。对于不同的数据结构,填充的方式不同,有的是在中间部分填充,有的是在末尾部分填充,都是为了保证对齐。需要注意的是,对于这种结构体填充,不仅要保证结构体内部数据类型的对齐,还要保证整个结构体的对齐。
PS: 最后推荐一本值得仔细读读的书:深入理解计算机系统(原书第2版),以上的引用部分,也是引用自这本书里面的内容。