是否使用了分配提示
Does an allocation hint get used?
我正在阅读为什么在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
的使用是未指定的,但目的是作为一种辅助如果实现需要,可以将其定位。
在内存中分配与现有元素相邻或接近的新元素可以通过提高局部性来提高性能;因为它们通常是一起缓存的,所以附近的元素往往会一起沿着内存层次结构向上移动,而不会相互驱逐。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 我可以在 Boost.Spirit.Qi 中向列表运算符 (%) 提供内存分配提示吗?
- C 机器人,作业分配 - 由于内存泄漏而导致阀门错误.确实需要一些提示
- g++编译器提示在堆栈上进行分配
- 是否使用了分配提示