【问题标题】:Different implementations of C++ new [closed]C ++新的不同实现[关闭]
【发布时间】:2016-08-30 10:54:40
【问题描述】:

阅读这个问题:How to know which malloc is used?,malloc 似乎有很多不同的实现。

我试图为 C++ new 运算符找到类似的东西,但无法找到有关 new 的实现方式/位置以及是否存在不同实现的任何信息。他们吗?例如 glibc 使用什么?

【问题讨论】:

  • 这有关系吗?今天使用的某些实现可能会在明天改变 - 甚至今天晚些时候。
  • 你可以write your own allocator for your C++ objects,这是主要的区别。 C++ 内部有自己的分配方法,不同于malloc() 和相关库。
  • 除非您有非常特殊的需要,否则您不需要关心。如果你这样做了,你可以编写自己的分配器。
  • new 是 C++ 语言结构(关键字),而不是 C 库或 C++ 库。由编译器供应商来实现它。因此,您需要为此查找您最喜欢的编译器的源代码(如果是 Microsoft,那么就没有运气了)。如果您对内存分配感兴趣,您可能还想看看我的 never_will_be_answered thread 关于内存分配挂钩。
  • @Drop 感谢您的评论。 @Nik Bougalis 是的,这很重要(有时),如果您进行并行编程并在可用空间上分配对象,则必须有一个高效的!跟踪(未)分配空间的机制,我很想知道这个机制在我运行代码的系统上是如何工作的

标签: c++ new-operator


【解决方案1】:

这是我找到的几个分配器:

HOARD(GNU + 商业许可证)

用于 SMP 的 MicroQuill SmartHeap(商业许可)

Google Perf 工具 TCMalloc(BSD 许可证)

NedMalloc(BSD 许可证)

JemAlloc(BSD 许可证)

PTMalloc(GNU,还没有 Windows 端口?)

英特尔线程构建模块(GNU,商业)

但我仍然很好奇如何确定我的编译器使用的默认分配器...

【讨论】:

    【解决方案2】:

    根据我的经验,唯一知道的方法就是强迫它:

    void* operator new (std::size_t size) throw (std::bad_alloc)
    {
        void *ptr = malloc(size);
        if (!ptr) throw std::bad_alloc();
    }
    
    void operator delete(void *ptr)
    {
        free(ptr);
    }
    

    对其他 3 个版本执行相同操作。

    肯定有人会声称您无法替换标准库版本。如果您正在与标准库动态链接,那么它们是正确的,所以不要这样做。如果您是静态链接,则此方法有效。

    【讨论】:

    • C++ 标准明确允许您替换 operator newoperator delete,因此任何不允许的实现都不是真正的 C++。
    • @JerryCoffin:这是 Windows 的事情。
    猜你喜欢
    • 2018-11-24
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多