2017-08-04 174 views
18

存在幾種排列版本古老的malloc()的,例如:真的沒有realloc()支持對齊的版本嗎?

#include <stdlib.h> 
int posix_memalign(void **memptr, size_t alignment, size_t size); 
void *aligned_alloc(size_t alignment, size_t size); 

#include <malloc.h> 
void *memalign(size_t alignment, size_t size); 

(原產於POSIX,分別的glibc和Linux的libc)。但 - 我似乎無法找到任何支持對齊的realloc()版本。它真的從未實現過嗎?將非對齊的realloc()的功能與對齊的malloc()變體中對齊的內存塊進行搜索相結合看起來非常簡單。

相關:

Does realloc keep the memory alignment of posix_memalign?

+0

是的。沒有很多原因。一個是,已分配的已分配函數不保存有關已分配塊的數據大小的信息,也不可能有任何數據副本。這留給應用程序開發人員。有很多原因,在很多年前非常積極地討論 - 請看適當的郵件列表存檔以獲得詳細信息 –

+3

@PeterJ:您是否認爲對齊的分配函數比'malloc()'保存的_less_信息更節省?我非常懷疑它...無論如何,如果你可以充實一些,最好有一些討論的鏈接,請發表一個答案。 – einpoklum

+0

不少於。論壇的主題太複雜了。瀏覽郵件列表存檔以獲取解釋。 –

回答

3

不結盟的realloc只在微軟實現與_aligned_realloc功能。 在Linux中沒有定義POSIX版本並且沒有實現。我從來不明白爲什麼,因爲在glibc中編碼似乎並不複雜。 考慮到寬SIMD指令的出現,我認爲有人實施它是時間問題。

此刻,只需分配一個新的對齊內存塊,複製內容並釋放舊指針。這不應該減慢你的應用程序。

+2

如果您丟棄了最後一個句子,我不是那麼無知......另外,如果可能的話,我們希望官方消息來源。 – einpoklum

+2

要麼你有自己的內存池,並且可以實現自己的對齊realloc,要麼使用memalign + memcpy + free,要麼等待更有用的答案,因爲你「不那麼笨」。 – yakoudbz