2010-10-01 80 views
31

GCC或glibc中是否有任何標準化函數在對齊的指針處分配內存塊? 像_align_malloc()在MSVC?在GCC中對齊malloc()?

+0

stdlib唯一版本http://stackoverflow.com/questions/227897/how-to-allocate-aligned-memory-only-using-標準庫 – 2017-03-16 07:22:30

回答

4

這取決於您期望的對齊方式。你想要一個更嚴格的路線,還是更放鬆的路線?

malloc根據定義,保證返回一個正確對齊的指針,用於存儲C程序中的任何標準類型(以及因此,從標準類型構建的任何類型)。這是你在找什麼?或者你需要不同的東西?

+15

一個普通的p因爲SIMD類型(比如SSE向量)不被認爲是「標準類型」,因此它們比malloc提供的更嚴格的對齊要求。 – jalf 2011-07-09 11:01:58

+0

想要做到這一點的另一個原因是性能。通過對齊數據結構,使其跨越'n'而不是'n + 1' L1高速緩存行,其大小通常爲4096個字節左右,所以您平均可以獲得更快的內存訪問。對於某些應用程序,比如說音頻處理,其中緩衝區是L1緩存線的大小,或者是該大小的小數倍,這可能會產生很大的差異。 – nitro2k01 2014-04-14 22:08:11

+2

@ nitro2k01:高速緩存行比較小,例如在x86上32,在amd64上64。 OTOH頁面是4k。 – diapir 2014-07-05 01:09:16

19

的〔posix_memalign()] [1]函數提供對準的存儲器分配和由於glibc的2.1.91 已面世。

但不一定與其他編譯器:引用標準 「的posix_memalign()函數是諮詢信息選項的一部分,不需要設置在所有的實現」

24

既然有人問,一個新的功能進行了標準化的C11:

void *aligned_alloc(size_t alignment, size_t size); 

,它是在glibc的可用(未在Windows,據我所知)。它的參數採用與memalign相同的順序,與微軟的_aligned_malloc相反,並且像往常一樣使用free函數進行重新分配。

7

_mm_malloc和其通過在x86/x64世界大部分編譯器支持_mm_free,與至少:

  • GCC
  • MinGW的(GCC的Win32/Win64的)
  • MSVC
  • ICC

A FAIK,這些功能根本不是標準。但據我所知,這是最受支持的。其他的功能也越來越編譯具體:

  • _aligned_malloc是MSVC和MinGW只
  • POSIX包括memalign功能不被至少MSVC

還有C11標準功能的支持,但遺憾的是他們都沒有C++ 11,幷包括他們在C++中需要非標準的預處理器定義...