我意識到任何這樣的功能都可能是非標準的,但對我的用例來說沒關係。基本上,我需要一個方法(即使它只通過glibc的syscall()接口公開),我可以將指針傳遞給(通過前一次調用malloc()返回的指針),該指針返回塊的大小指針指向。這樣的事情存在嗎?任何函數來查詢分配塊的大小?
回答
所以,據我所知,至少有在C90/C99無此功能。一些系統,主要是libc,提供了獲取分配大小的函數(例如Mac OS X中的malloc_size()),但這不是可移植的,可能你應該避免使用它。
沒有必要使用非標準的功能,它不是很難與必要的功能寫你自己的分配器。
你必須知道的大小,當你分配塊,所以乾脆保留該信息。國際海事組織在很少情況下不會知道這些信息,因爲根據定義,您在分配時就知道它。然而,如果你需要這樣的功能,你可以簡單地通過包裝malloc()來完成,並且將大小預先等待到塊。
void* smalloc(size_t size)
{
// allocate block with additional space for size
void* blk = malloc(size + sizeof(size_t)) ;
// set the size
*((size_t*)blk) = size ;
// return pointer to block after size field (user block)
return ((size_t*)blk) + 1 ;
}
void sfree(const void* blk)
{
// Free from the size field address, not the user block
free(((const size_t*)blk) - 1) ;
}
size_t ssize(const void* blk)
{
// Size is immediately before user block
return *(((size_t*)blk) - 1) ;
}
在吉姆·巴克的觀點;在某些目標上,可能需要一些跳動來保持必要的對齊。如果對齊不是最優的,某些目標將生成效率較低的代碼,而其他目標則會導致中止。所以要小心這個解決方案。我個人對這種解決方案的需求很謹慎!
一個解決方案可能是使用一個數據結構,如以malloc地址爲關鍵字的哈希表,並將大小作爲內容,並使用相同的包裝技術將大小與塊分開存儲 - 在費用或性能,額外的存儲空間,以及可管理的區塊數量方面可能有限的容量限制。
但是你這樣做,根本點依然有效 - 包裝的基本服務提供你所需要的。
我注意到,這與Emil H的解決方案在dmckee對原始問題的評論中的第二個鏈接中給出的或多或少相同。然而,作爲評論的代碼或許它仍然有優點,所以我讓它站起來。 – Clifford 2009-09-15 18:29:25
這打破了任何對齊保證,malloc可能會在特定的平臺上給你。例如,如果你在一個保證8字節對齊的平臺上,現在這個代碼示例將它變成4字節對齊。 – 2009-09-15 18:42:44
(上面假設當然是一個4字節的sizeof(size_t)。) – 2009-09-15 18:44:04
_msize在Windows平臺上。
- 1. 查找由malloc函數分配的大小
- 2. 區分大小寫查詢
- 3. 查詢我的塊大小oracle
- 4. 如何在分配新塊時控制`std :: deque`的塊大小?
- 5. LINQ查詢:如何做不區分大小寫的查詢?
- 6. 如何獲取匹配查詢ElasticSearch的數據的總大小?
- 7. 查找分配內存的大塊
- 8. SQLite的查詢:匹配任何整數
- 9. 如何查詢數據庫的區分大小寫的值
- 10. Django查詢不區分大小寫的列表匹配
- 11. 數據庫查詢在Lower()/ Upper()sql函數之前如何處理區分大小寫的查詢?
- 12. MySQL中區分大小寫的查詢
- 13. MySQL區分大小寫的查詢
- 14. 區分大小寫的aes_decrypt查詢
- 15. 區分大小寫的查詢
- 16. 不區分大小寫的查詢
- 17. MySQL查詢的WHERE區分大小寫
- 18. Mongoid不區分大小寫的查詢
- 19. Doctrine2區分大小寫的查詢
- 20. 區分大小寫的LDAP查詢
- 21. Solr不區分大小寫的查詢
- 22. 的SQL Server查詢區分大小寫
- 23. 區分大小寫的MySQL如查詢
- 24. 區分大小寫的查詢Idiorm/SQLite
- 25. 大查詢分析函數提高查詢性能
- 26. Neo4j在大數據庫中分離查詢效率的大小
- 27. ElasticSearch函數分數查詢
- 28. 在elasticsearch中匹配查詢是否區分大小寫?
- 29. 如何將矢量大小分配給數組大小C++?
- 30. 爲什麼在重新分配小塊時分配大塊內存失敗
我們以前做過這個。兩次我想。鏈接來... – dmckee 2009-09-15 17:53:53
http://stackoverflow.com/questions/232691/how-can-i-get-the-size-of-an-array-from-a-pointer-in-c和http:// stackoverflow.com/questions/1208644/how-can-i-get-the-size-of-a-memory-block-allocated-using-malloc-closed – dmckee 2009-09-15 17:56:35
BTW:我發現我的那些搜索「[的malloc]發現大小的塊」。 – dmckee 2009-09-15 17:57:41