内存对齐的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,请问这两次内存访问怎么解释?能够举个具体的例子?
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版),以上的引用部分,也是引用自這本書裏麵的內容。