我意识到任何这样的功能都可能是非标准的,但对我的用例来说没关系。基本上,我需要一个方法(即使它只通过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. 查询我的块大小oracle
- 2. 查找分配内存的大块
- 3. SQLite的查询:匹配任何整数
- 4. 如何查询数据库的区分大小写的值
- 5. Django查询不区分大小写的列表匹配
- 6. 数据库查询在Lower()/ Upper()sql函数之前如何处理区分大小写的查询?
- 7. 的SQL Server查询区分大小写
- 8. 区分大小写的MySQL如查询
- 9. MySQL查询的WHERE区分大小写
- 10. 不区分大小写的查询
- 11. MySQL中区分大小写的查询
- 12. Solr不区分大小写的查询
- 13. 大查询分析函数提高查询性能
- 14. Neo4j在大数据库中分离查询效率的大小
- 15. ElasticSearch函数分数查询
- 16. 如何将矢量大小分配给数组大小C++?
- 17. 为什么在重新分配小块时分配大块内存失败
- 18. Torch7函数addmv的大小不匹配
- 19. SQLite查询区分大小写
- 20. Mysql查询区分大小写?
- 21. 不区分大小写查询
- 22. sqlite高级区分大小写查询
- 23. 函数来计算父母的大小从儿童的大小
- 24. 在函数内分配变量类型和大小数组(C++)
- 25. 查询参数区分大小写检查?
- 26. 动态分配大小的数组0
- 27. 解除分配后的数组大小
- 28. SQL查询查询结果的大小
- 29. mySQL查询大小
- 30. SQL查询 - mod函数 - 如何使用它来分组结果?
我们以前做过这个。两次我想。链接来... – 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