是否使用了分配提示

Does an allocation hint get used?

本文关键字:分配 提示 是否      更新时间:2023-10-16

我正在阅读为什么在c++分配器中没有重新分配功能?是否有可能在运行时在堆上创建一个数组,然后在需要时分配更多的空间?,其中明确指出动态对象数组的重新分配是不可能的。

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

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

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

有任何实现利用这一点吗?

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

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

The Standard说这个提示一定是之前调用allocate返回的。它说"[暗示]的使用是不确定的,但它是。目的是为了帮助定位。"因此,如果你在一个线程上分配和释放一系列类似大小的块,你可能会传递先前释放的值,以避免微处理器缓存之间的缓存争用。

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

c++ 11中20.6.9.1 allocator成员:

4 - [注意:在容器成员函数中,相邻元素的地址通常是传递hint实参的好选择。- 结束说明]
[…]
6 -[…]hint的使用是未指定的,但目的是作为一种辅助如果实现需要,可以将其定位。

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