_Expand与new对比GNU

Jak*_*zer 8 c++ malloc memory-management

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

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

  1. 对于Linux黑客攻击,我应该知道类似的功能吗? 大部分回答
  2. 是否有一个标准的钩子,我可以建立一个类似的功能? 回答
  3. 有谁知道_expand提供什么样的性能?
  4. 它如何与LFH上分配的对象进行交互?

为了澄清我的兴趣,我正在尝试构建一个单链接的累加器,它扩展以尽量减少碎片,同时按照传统的双端实现方式分配多个元素块.通过约束元素添加和删除的用例,我希望优化整个结构的删除时间,以及元素插入和索引.结果,_expand的"大声失败"让我让结构能够智能地思考何时以及它是否可以在适当的位置调整,以及它在何处可以放置数据.

Ton*_*roy 3

C++ 一直在使用newand deletesans 来解决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));
Run Code Online (Sandbox Code Playgroud)

不过,您似乎无法realloc在该特定决策点拦截现有实现,或者轻松了解它是否会就地调整大小,因此您可能必须重新实现所有内容(或适应许多现有堆实现中的任何一个) 。