C 有查询已分配块大小的函数吗?
我意识到任何这样的函数都可能是非标准的,但这对于我的用例来说是可以的。基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开),我可以传递一个指针(之前调用malloc()返回的指针),返回指针指向的块的大小。这样的东西存在吗?据我所知,至少在C90/C99中没有这样的功能。一些系统(主要是libc)提供了获取分配大小的函数(例如Mac OS X中的malloc_size()),但这是不可移植的,您最好不要使用它。不需要使用非标准函数,编写自己的具有必要功能的分配器并不困难 分配块时必须知道大小,因此只需保留该信息即可。在IMO中,很少有情况下您不知道这些信息,因为根据定义,您在分配信息时就知道这些信息。但是,如果需要此类功能,只需包装malloc(),并将大小预挂起到块中即可C 有查询已分配块大小的函数吗?,c,memory,malloc,glibc,C,Memory,Malloc,Glibc,我意识到任何这样的函数都可能是非标准的,但这对于我的用例来说是可以的。基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开),我可以传递一个指针(之前调用malloc()返回的指针),返回指针指向的块的大小。这样的东西存在吗?据我所知,至少在C90/C99中没有这样的功能。一些系统(主要是libc)提供了获取分配大小的函数(例如Mac OS X中的malloc_size()),但这是不可移植的,您最好不要使用它。不需要使用非标准函数,编写自己的具有必要功能的分配器并不困难
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地址为键、大小为内容的哈希表,并使用相同的包装技术将大小与块分开存储——以牺牲性能或额外存储为代价,也许在可管理的数据块数量方面对容量有一些有限的限制
无论您如何操作,基本点仍然有效-包装基本服务以提供您所需。在Windows平台上使用msize。我们以前已经这样做过。我想了两次。链接来了。。。顺便说一句:我在搜索“[malloc]find size block”时发现了这些问题。我注意到这与Emil H在dmckee对原始问题的评论的第二个链接中给出的解决方案大致相同。然而,作为注释代码,它可能仍然有优点,所以我让它保持不变。这打破了malloc在特定平台上可能给您的任何对齐保证。例如,如果您所处的平台保证8字节对齐,则此代码示例现在将其转换为4字节对齐。同意。关于这一问题增加了补充说明。