2014-07-01 46 views
1

我目前正在使用NUMA機器。我正在使用​​來釋放我分配的內存。但是,與free不同,​​需要知道要釋放多少個字節。有什麼方法可以知道一個指針指向了多少個字節而沒有將它指出來?如何獲取指針指向的內存大小?

+0

知道它是完全尷尬(或不可能)。這是祕密的,可以「免費」知道。此外,如果你分配,那麼你已經知道這一點。 –

+0

如果你正在使用malloc來分配內存,或者其他明智的你必須查找malloc在哪裏存儲它的元數據......在由malloc創建的元數據同時聲明一塊內存以供使用..它通常存儲在該調用中分配的內存塊大小... – PRP

回答

0

指針只是表示內存中的一個獨特點,它通常是數據啓動的地方。始終由開發人員來跟蹤該位置提供了多少空間。 (free是規則的例外)。

1

如果您爲單個值分配內存,則可能使用sizeof()來查找該值類型所需的空間量。你也應該知道這個類型是什麼類型的,因爲它是指針的類型。因此,您可以在同一類型上再次撥打sizeof()。 (例如,如果您分配sizeof(Foo)字節來存儲到一個Foo*,那麼你要釋放sizeof(Foo)字節爲好。)

如果爲陣列分配的內存,您應該已經保持該數組的長度的軌道,例如以便在迭代時知道停止的位置。將該長度乘以單個元素類型的大小。

3

使用底層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))); 
} 
+2

警告:該代碼不可移植。考慮一臺具有32位size_t的機器,但是對於雙倍的64位對齊要求,比如ARM。您返回的指針將無法正確對齊。 – pdw

+0

是的,好點。那麼,如果'numa_alloc_local'承諾以8字節對齊分配緩衝區,那麼仍然可以改善這個代碼分配額外的8個字節而不是4個。 –

2

存儲分配大小內存指針報告。

@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; 
}