【问题标题】:Does an allocation hint get used?是否使用分配提示?
【发布时间】:2013-03-01 02:13:50
【问题描述】:

我正在阅读 Why is there no reallocation functionality in C++ allocators?Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?,它们清楚地表明重新分配对象的动态数组是不可能的。

然而,在 Josuttis 的 C++ 标准库 中,它声明了一个分配器 allocator,具有一个函数 allocate,语法如下

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0)

hint 具有实现定义的含义,可用于帮助提高性能。

有没有利用这一点的实现?

【问题讨论】:

    标签: c++ allocator


    【解决方案1】:

    我在 plf::colony c++ 容器中使用带有 std::allocator 的提示在 Visual Studio 2010-2013 下的小标量类型的迭代时间方面获得了显着的性能优势(迭代速度提高了约 21%),并且加速速度要小得多在 GCC 5.1 下。所以可以肯定地说,使用这些编译器和 std::allocator,它会有所作为。但差异将取决于编译器。我不知道提示忽略分配器与提示观察分配器的比例。

    【讨论】:

    • 我认为提示是提供对齐,就像向前对齐的指针一样。您是否知道这在现代 C++ 标准std::allocator 上是如何实现的?
    • 您能否详细说明一下您是如何使用提示的以及为什么它可能会提高性能?
    【解决方案2】:

    我不确定具体的实现,但请注意分配器在传递给deallocate 之前不允许返回提示指针值。所以这不能用作形成reallocate的原始操作。

    标准说该提示一定是由先前对allocate 的调用返回的。它说“[提示]的使用未指定,但它是 旨在帮助局部性。”因此,如果您在一个线程上分配和释放一系列相似大小的块,您可能会传递先前释放的值以避免微处理器缓存之间的缓存争用。

    否则,当 CPU B 发现您正在使用仍在 CPU A 缓存中的内存地址时(即使该内存包含根据 C++ 销毁的对象),它必须通过总线转发垃圾数据。最好让 CPU A 和 B 重用各自的缓存地址。

    【讨论】:

      【解决方案3】:

      C++11 状态,在 20.6.9.1 分配器成员中:

      4 - [ 注意: 在容器成员函数中,相邻元素的地址通常是传递hint 参数的好选择。 — 结束说明 ]
      [...]
      6 - [...] hint 的使用未指定,但旨在作为帮助 如果实现需要,则到本地化。

      在内存中分配与现有元素相邻或接近的新元素可以通过提高局部性来提高性能;因为它们通常被缓存在一起,所以附近的元素往往会一起沿着内存层次向上移动,并且不会相互驱逐。

      【讨论】:

      • 啊,所以它是用于分配彼此相邻的对象而不是重新分配现有对象?
      • 您不能只传递下一个可用地址。提示必须是从之前对allocate 的调用中获得的。
      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多