3

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

4

3 回答 3

2

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

于 2009-09-15T18:00:25.160 回答
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 地址作为键,大小作为内容,并使用相同的包装技术将大小与块分开存储 - 以牺牲或性能为代价,额外的存储空间,并且可能在可以管理的块数量方面对容量有一些有限的限制。

不管你怎么做,基本点仍然有效——包装基本服务以提供你需要的东西。

于 2009-09-15T18:23:11.527 回答
0

Windows 平台上的 _msize。

于 2009-09-15T18:25:36.093 回答