_Expand与new对比GNU

时间:2010-12-06 02:06:58

标签: c++ memory-management malloc

最近,我结交了一位新朋友。他的名字是_expand,我们进行了一些很好的交谈,我甚至和他一起出去过几次。但是当我开始四处询问时,没有人听说过我的_expand。我开始怀疑了。我在微软和一些其他业务部门的朋友中打了几个完全非隐喻的朋友。没有。没人用过它。我在各种搜索引擎和源树周围涂鸦。没有什么,除了粗略提到这里和那里。当然,关于性能和兼容性的信息不足以将_expand引入生产代码或更具针对性的通用库。

更糟糕的是,我没有在任何gnu库中找到相同的功能,所以我与新朋友讨论的任何东西都不会是便携式的。这是一个耻辱,因为它真的是一个令人着迷和令人兴奋的能力。当然,我可以深入研究realloc,并将它的功能分开,但问题在于* nixes上的大部分实现都是高度可变的。所以我必须在版本之后编写代码以尝试获得便携式_expand。但是,在glib或扩展的gnu libs中没有类似的东西似乎很荒谬。

  1. 对于Linux黑客攻击,我应该知道类似的功能吗? 主要回答
  2. 是否有标准钩子可以构建类似的功能?的回答
  3. 有谁知道_expand提供什么样的性能?
  4. 它如何与LFH上分配的对象进行交互?
  5. 为了澄清我的兴趣,我正在尝试构建一个单链接的累加器,它扩展以尽量减少碎片,同时按照传统的双端实现方式分配多个元素块。通过约束元素添加和删除的用例,我希望优化整个结构的删除时间,以及元素插入和索引。结果,_expand的“大声失败”让我让结构能够智能地思考何时以及是否可以在适当的位置调整大小,以及它在何处可以放置数据。

1 个答案:

答案 0 :(得分:3)

C ++已经过newdelete sans任何等价的realloc表明这些事情得到的关注很少。毫不奇怪_expand在操作系统级别甚至无法始终可用时,在很大程度上被忽略了。如果你想自己动手,那么用户定义的malloc版本有很多先例,在我的Linux机器上快速查看/usr/include/malloc.h就可以明确地显示这个... ...

/* Called once when malloc is initialized; redefining this variable in
   the application provides the preferred way to set up the hook
   pointers. */
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void));
/* Hooks for debugging and user-defined versions. */
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr,
                                        __const __malloc_ptr_t));
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size,
                                                    __const __malloc_ptr_t));
extern __malloc_ptr_t (*__realloc_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr,
                                                     size_t __size,
                                                     __const __malloc_ptr_t));
extern __malloc_ptr_t (*__memalign_hook) __MALLOC_PMT ((size_t __alignment,
                                                       size_t __size,
                                                      __const __malloc_ptr_t));
extern void (*__after_morecore_hook) __MALLOC_PMT ((void));

看起来你不能在那个特定的决策点拦截现有的realloc实现,或者很容易了解它是否会在适当的位置重新调整,所以你可能不得不重新实现一切(或者适应任何许多现有的堆实现。)