我目前正在使用NUMA機器。我正在使用來釋放我分配的內存。但是,與free
不同,需要知道要釋放多少個字節。有什麼方法可以知道一個指針指向了多少個字節而沒有將它指出來?如何獲取指針指向的內存大小?
回答
指針只是表示內存中的一個獨特點,它通常是數據啓動的地方。始終由開發人員來跟蹤該位置提供了多少空間。 (free
是規則的例外)。
如果您爲單個值分配內存,則可能使用sizeof()
來查找該值類型所需的空間量。你也應該知道這個類型是什麼類型的,因爲它是指針的類型。因此,您可以在同一類型上再次撥打sizeof()
。 (例如,如果您分配sizeof(Foo)
字節來存儲到一個Foo*
,那麼你要釋放sizeof(Foo)
字節爲好。)
如果爲陣列分配的內存,您應該已經保持該數組的長度的軌道,例如以便在迭代時知道停止的位置。將該長度乘以單個元素類型的大小。
使用底層API無法獲得內存大小。在分配某處時必須記住大小。例如,你可以寫你自己的分配器,其分配4個額外的字節,存儲在緩衝區的前4個字節大小,和釋放過程中,你可以從中讀取緩衝區的大小:之前
void *my_alloc(size_t size)
{
void *buff = numa_alloc_local(size + sizeof(size_t));
if (buff == 0) return 0;
*(size_t *)buff = size;
return buff + sizeof(size_t);
}
void my_free(void *buf)
{
numa_free(buf - sizeof(size_t), *(size_t *)(buf - sizeof(size_t)));
}
警告:該代碼不可移植。考慮一臺具有32位size_t的機器,但是對於雙倍的64位對齊要求,比如ARM。您返回的指針將無法正確對齊。 – pdw
是的,好點。那麼,如果'numa_alloc_local'承諾以8字節對齊分配緩衝區,那麼仍然可以改善這個代碼分配額外的8個字節而不是4個。 –
存儲分配大小內存指針報告。
@light_keeer有一個很好的解決方案/方法,但有潛在的對齊問題@pdw。
my2_alloc()
,與malloc()
一樣,可能會返回符合C規範的對齊要求的指針。同樣,my2_alloc()
也需要確保返回的指針符合對齊要求。
指針返回如果分配成功,則對齊適當,使得其可以被分配給一個指針到任何類型的對象與基本對準要求...
C11dr§7.22.3存儲器管理功能A 基本對齊由小於或等於實現在所有上下文中支持的最大對齊數的對齊表示,其等於
_Alignof (max_align_t)
。 §6.2.82
Follows是一個候選C99解決方案。
// Form a prefix data type that can hold the `size` and preserves alignment.
// It is not specified which is type is wider, so use a union to allocate the widest.
#include <stddef.h>
union my2_size {
size_t size;
max_align_t a;
}
void *my2_alloc(size_t size) {
union my2_size *ptr = numa_alloc_local(sizeof *ptr + size);
if (ptr) {
ptr->size = size;
ptr++;
}
return ptr;
}
void my2_free(void *buf) {
if (buf) {
union my2_size *ptr = buf;
ptr--;
numa_free(ptr, sizeof *ptr + ptr->size);
}
}
// Return how many bytes are pointed to by a pointer allocated with my2_alloc()
size_t my2_size(void *buf) {
if (buf) {
union my2_size *ptr = buf;
ptr--;
return ptr->size;
}
return 0;
}
- 1. 如何計算指針指向內存的大小?
- 2. 指針的大小,指向C中指針的指針
- 3. 指針向量的大小
- 4. C - 字符的內存大小指針
- 5. 獲取由ctypes指針指向的內存地址
- 6. 內存分配指針指向數組和指針指針
- 7. 獲取動態指針的大小C++
- 8. 爲什麼指向函數的指針的大小與指向成員函數的指針的大小不同?
- 9. 指針指針,我如何獲取值?
- 10. 獲取指向索引行的指針
- 11. GetModuleHandle獲取指向IMAGE_DOS_HEADER的指針?
- 12. 獲取雙指針指向的對象
- 13. c指向指針內存分配的指針
- 14. 如何釋放指向保存地址的指針的指針
- 15. 如何獲得該指針指針指向的值的地址
- 16. 投射指向int的指針/存儲指向T的指針
- 17. 獲取指向智能指針指向的對象的指針 - Ivalue錯誤
- 18. 指針的大小
- 19. 是否可以獲取指針在Delphi 7中指向的類型的大小?
- 20. 如何獲取指南針方向
- 21. 如何從文件讀取指向整型指針的指針?
- 22. 如何找到指針引用的內存大小?
- 23. 如何根據指針地址獲取指針內容
- 24. 獲取對象指針指向
- 25. 如何使用地圖的指針獲取地圖的大小?
- 26. 在C中,如何更改指針指向的內存地址?
- 27. 如何區分指向共享和全局內存的指針?
- 28. 如何釋放C中由兩個指針指向的內存?
- 29. 調整大小的指針向量segfaults
- 30. 指針調整大小的向量
知道它是完全尷尬(或不可能)。這是祕密的,可以「免費」知道。此外,如果你分配,那麼你已經知道這一點。 –
如果你正在使用malloc來分配內存,或者其他明智的你必須查找malloc在哪裏存儲它的元數據......在由malloc創建的元數據同時聲明一塊內存以供使用..它通常存儲在該調用中分配的內存塊大小... – PRP