2011-06-20 388 views

回答

10

基本上,如果你需要更嚴格的對準比的malloc會給您。 Malloc通常返回一個對齊的指針,以便它可以與任何基本類型(通常,普通臺式機上的8個字節)一起使用。

但是,有時您需要將內存與其他邊界對齊,例如4K對齊等。在這種情況下,您需要memalign

  • 寫入內存管理器(如垃圾收集器)時,您將需要這一點,例如,。在這種情況下,處理大塊大小的內存有時很方便。這樣,您可以將meta數據存儲在分配區域底部的給定塊中的所有對象中,並通過掩蓋對象指針的最低有效位來簡單地訪問它。
  • 當與硬件接口(從來沒有做過這個,但是IIRC,某些類型的塊設備需要對齊的存儲器)。有關詳細信息,請參見n.m.的答案。
+0

@ Dirk,似乎這並沒有回答**當我們需要**。 –

+2

更多示例:SIMD類型可能需要比'malloc'提供的更多對齊方式。如果代碼使用性能高的技巧,可能需要與高速緩存行大小相對應的對齊方式 - 如果您正在編寫動態鏈接器(即將代碼加載到內存中的代碼),那麼您正在加載的代碼可能需要其功能與緩存行邊界對齊。 –

+0

@Steve Jessop,如果'16 * 1024'的內存大小和'16'而不是默認的'8'對齊,我們會受益嗎? –

2

各種硬件可能有對齊要求,其中malloc不能滿足。 Linux手冊頁給出了一個這樣的例子,我引用:

在許多系統上存在對齊 限制,例如,用於 直接塊設備I/O。 POSIX 指定 pathconf(path,_PC_REC_XFER_ALIGN)調用 ,它告訴需要什麼對齊。

1

幾個用途:

  • 一些處理器具有被上的二的冪大於或等於緩存器大小對準的指令,這將僅在數據工作 - 例如位反向尋址用於fft(快速傅立葉變換)的指令。

  • 將數據與高速緩存邊界對齊以優化多處理應用程序中的訪問,以使同一高速緩存行中的數據不會被兩個處理器同時訪問。

基本上,如果你不需要做優化和/或硬件的荒謬水平不要求數組是一個特定的邊界上,那麼你可以約posix_memalign忘記。

+0

你認爲'cache boundaries'和'cache line'是什麼意思? –

+0

@ compile-fan:http://en.wikipedia.org/wiki/CPU_cache –

4

posix_memalign唯一的好處,據我所知,有:

  1. 分配頁對齊(通常爲4096或更大的排列)爲特定硬件的目的內存。
  2. 邪惡的黑客,你保持低N位零指針,所以你可以存儲一個N位整數在低位。 :-)
+0

我不明白第二點,你能舉個例子嗎? –

+1

@編譯風扇,如果你指向的對象都大於4字節,並且在4字節的邊界上對齊,如果你總是將它們掩蓋到指針底部,你可以從指針底部竊取2位在將指針用作指針之前爲零。 –

+0

我問這個問題的確切原因是因爲我看到nginx會這樣做:'ngx_memalign(NGX_POOL_ALIGNMENT,size,log);',這裏'NGX_POOL_ALIGNMENT'被定義爲'16',http://nginxs.googlecode.com/svn- history/trunk/src/core/ngx_palloc.c –

相關問題