10

我在阅读为什么 C++ 分配器中没有重新分配功能?是否可以在运行时在堆上创建一个数组,然后在需要时分配更多空间?,这清楚地表明重新分配对象的动态数组是不可能的。

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

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

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

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

4

3 回答 3

4

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

于 2015-10-03T02:24:34.927 回答
2

我不确定具体的实现,但请注意分配器在传递给deallocate. 所以这不能用作形成reallocate.

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

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

于 2013-03-13T09:09:14.310 回答
1

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

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

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

于 2013-03-13T09:06:33.303 回答