【问题标题】:Any function to query the size of an allocated block?任何查询分配块大小的函数?
【发布时间】:2010-11-28 13:24:31
【问题描述】:

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

【问题讨论】:

标签: c memory malloc glibc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您在分配块时必须知道大小,因此只需保留该信息即可。当您不知道该信息时,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 地址作为键,大小作为内容,并使用相同的包装技术将大小与块分开存储 - 代价是或性能、额外的存储空间,以及可能在可管理的块数量方面对容量的一些有限限制。

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

    【讨论】:

    • 我注意到这与 dmckee 对原始问题的评论中的第二个链接中给出的 Emil H 的解决方案或多或少相同。但是,作为注释代码,它可能仍然有优点,所以我让它保持不变。
    • 这破坏了 malloc 可能在特定平台上为您提供的任何对齐保证。例如,如果您在保证 8 字节对齐的平台上,此代码示例现在将其转换为 4 字节对齐。
    • 同意。在该问题上添加了附加说明。
    【解决方案3】:

    _msize 在 Windows 平台上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2021-01-15
      • 2014-08-20
      • 2018-12-21
      • 2020-07-27
      相关资源
      最近更新 更多