【问题标题】:How does GCC implement the C++ standard allocator?GCC 如何实现 C++ 标准分配器?
【发布时间】:2018-07-09 15:44:27
【问题描述】:

我不熟悉追踪源代码以找出 C++ 标准分配器的 GCC STL 实现 (libstdc++),并且我找不到任何描述 GCC 选择的内存模型的简要说明、文档和技术报告.

我猜 GCC 使用几个固定大小的桶来存储相同大小的小对象(以字节为单位),并为特定大小的大对象分配大内存空间ad hoc

GCC 为 C++ 标准分配器选择的具体内存模型是什么?

【问题讨论】:

  • 你为什么不看看标题?
  • @manni66 编译器头文件经常调用内部函数而不是实际包含代码。
  • 您是专门询问std::allocator 还是堆?一个可能是在另一个之上实现的。
  • @Useless 是的。我想知道std::allocator 是如何实现的。特别是阈值的确切数量、桶数据结构等。

标签: c++ gcc memory-management allocator


【解决方案1】:

std::allocator 只使用operator newoperator delete,而它们又简单地包装mallocfree

因此,实现被委托给 C 库,无论哪个恰好在使用中。

【讨论】:

  • 感谢您的简短回答。 ;-)
【解决方案2】:

我找不到任何描述 GCC 选择的内存模型的简要说明、文档和技术报告

阅读代码。它是开源的,并且作为纯文本包含在编译器中。

如果您不确定您的标准标题在哪里,您可以执行以下两项操作之一:

  1. 了解如何询问编译器as in this question

  2. 欺骗编译器告诉你,例如。通过尝试做某事std::allocator 不能

    #include <memory>
    
    int main() {
        std::allocator<int> a;
        a.allocate(&a);
        return 0;
    }
    

    给予

    error ... 
    In file included from \
      /usr/include/x86_64-linux-gnu/c++/6/bits/c++allocator.h:33:0,
    

当您发现std::allocator 只是使用堆来做出所有这些决定时,您可以查看glibc source 中的malloc

【讨论】:

  • 谢谢。我发现实际的实现在new_allocator.h,它只是newdelete的一个包装器。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2016-07-06
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多