84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
内存对齐的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,请问这两次内存访问怎么解释?能够举个具体的例子?
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版),以上的引用部分,也是引用自这本书里面的内容。