查询分配块大小的任何函数?

时间:2009-09-15 17:51:47

标签: c memory malloc glibc

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不需要使用非标准函数,编写具有必要功能的自己的分配器并不困难。

分配块时必须知道大小,因此只需保留该信息即可。当您不知道该信息时,很少有IMO情况,因为根据定义,您在分配信息时就知道了这一点。但是,如果您需要这样的功能,只需通过包装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地址作为键,大小作为内容,并使用相同的包装技术将大小与块分开存储 - 代价或性能,额外存储,以及可管理的块数量方面的容量限制。

但是你这样做,基本点仍然有效 - 包装基本服务以提供你需要的东西。

答案 2 :(得分:0)

在Windows平台上

_msize。