2009-09-15 19 views
2

我意识到任何这样的功能都可能是非标准的,但对我的用例来说没关系。基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开),我可以将指针传递给(通过前一次调用malloc()返回的指针),该指针返回块的大小指针指向。这样的事情存在吗?任何函数来查询分配块的大小?

+0

我们以前做过这个。两次我想。链接来... – dmckee 2009-09-15 17:53:53

+1

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

+0

BTW:我发现我的那些搜索“[的malloc]发现大小的块”。 – dmckee 2009-09-15 17:57:41

回答

2

所以,据我所知,至少有在C90/C99无此功能。一些系统,主要是libc,提供了获取分配大小的函数(例如Mac OS X中的malloc_size()),但这不是可移植的,可能你应该避免使用它。

1

没有必要使用非标准的功能,它不是很难与必要的功能写你自己的分配器。

你必须知道的大小,当你分配块,所以干脆保留该信息。国际海事组织在很少情况下不会知道这些信息,因为根据定义,您在分配时就知道它。然而,如果你需要这样的功能,你可以简单地通过包装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地址为关键字的哈希表,并将大小作为内容,并使用相同的包装技术将大小与块分开存储 - 在费用或性能,额外的存储空间,以及可管理的区块数量方面可能有限的容量限制。

但是你这样做,根本点依然有效 - 包装的基本服务提供你所需要的。

+0

我注意到,这与Emil H的解决方案在dmckee对原始问题的评论中的第二个链接中给出的或多或少相同。然而,作为评论的代码或许它仍然有优点,所以我让它站起来。 – Clifford 2009-09-15 18:29:25

+1

这打破了任何对齐保证,malloc可能会在特定的平台上给你。例如,如果你在一个保证8字节对齐的平台上,现在这个代码示例将它变成4字节对齐。 – 2009-09-15 18:42:44

+0

(上面假设当然是一个4字节的sizeof(size_t)。) – 2009-09-15 18:44:04

0

_msize在Windows平台上。