分配提示是否被使用?

时间:2013-03-13 08:32:36

标签: c++ allocator

我正在阅读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具有实现定义的含义,可用于帮助提高性能。

是否有任何实施可以利用此功能?

3 个答案:

答案 0 :(得分:2)

我在plf::colony c ++容器中的小标量类型的迭代次数上获得了显着的性能优势,使用Visual Studio 2010-2013下的std :: allocator提示(迭代速度提高了~21%),并且GCC 5.1下的加速比较小。因此可以肯定地说,使用那些编译器和std :: allocator,它会产生影响。但差异将取决于编译器。我不知道提示忽略与提示观察分配器的比例。

答案 1 :(得分:1)

C ++ 11指出, 20.6.9.1分配器成员

  

4 - [注意:在容器成员函数中,相邻元素的地址通常是传递hint参数的好选择。 - 结束记录]
  [...]
  6 - [...] hint的使用未指定,但旨在帮助   如果一个实现如此需要,那就到了地方。

在内存中将现有元素附近或靠近的新元素分配可以通过改善局部性来提高性能;因为它们通常被缓存在一起,所以附近的元素往往会在内存层次结构中一起移动,而不会相互驱逐。

答案 2 :(得分:1)

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

标准表示必须通过之前调用allocate返回提示。它说“[提示]的使用没有具体说明,但确实如此 旨在帮助本地化。“因此,如果您在一个线程上分配和释放一系列类似大小的块,您可以传递先前释放的值以避免微处理器缓存之间的缓存争用。

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