为什么std::allocator这么快?
How is std::allocator so fast?
我认为访问c++标准库的实现是不实际的,因为它是平台相关的(如果这句话错了请纠正我!)。嗯,我想用c++练习一些非常低级的东西(至少,我能用c++编程的低级)。所以,我开始写一个Allocator类,只是为了练习,学习,如果我创造了一些有用的东西,我计划在我的实际项目中使用它。
我的班级看起来还不错。它与经典的Base* pointer = new Derivative;
和pointer->~Base(); ::operator delete[] (pointer);
的分配、构造、销毁和回收策略一样快。事实上,对于10000000次迭代,我的类慢了0.1秒。
我问这个问题的原因是:std::allocator。对一些人来说,由于特定的原因,它可能会很慢;但是仅仅与我的实现相比,它非常快。请遵守我的代码:
int main()
{
for(int x=0; x<10000000; x++)
{
/* TEST 1: Using my Allocator class
A* a = Allocator<B>::construct(10,3.2);
Allocator<A>::destruct(a);
//*/
/* TEST 2: Using operators 'new' and 'delete[]'
A* a = new B(10,3.2);
delete a;
//*/
/* TEST 3: std::allocator
std::allocator<B> allocator;
std::allocator<A> deallocator;
A* a = allocator.allocate(1);
allocator.construct(a,10,3.2);
deallocator.destroy(a);
deallocator.deallocate(a,1);
//*/
}
}
关于我的代码的其他重要注意事项:类A是类b的基。Allocator<T>::construct(args...)
和Allocator<T>::destruct(pointer)
是静态内联方法。第一个方法既分配内存(只够一个对象使用),又在这个内存位置构造对象(通过使用参数)。第二个方法首先析构对象,然后释放内存位置。所有三个测试的结果(就我调试的结果而言)完全相同,并且可以正常工作。我将这个循环与这3个独立的测试一起使用(每次一个测试)。
下面是10000000次迭代的结果:
测试1:app. 1.550秒
测试2:app. 1.450秒
测试3:app. 1.200秒
(注:这些数字都是近似值)
std::allocator比两者都快得多。也许没有太大的区别,但我想知道这种区别的原因。我对std::allocator的实现非常好奇。谢谢你的帮助和时间。
附加信息:我在Ubuntu Quantal Quetzal下使用GCC 4.7.2
您将不得不学习分支预测和CPU流水线,内部实现的低时间复杂度算法,以及缓存一致性,以便进行高度优化。我不知道std::allocator
的实现,但从你的问题来看,我提到的事情是显著提高性能的领域。
编辑:如果std::allocator
像评论建议的那样使用new
和delete
,那么很容易使用一些内存池来制作更具体和优化的分配器。
std:allocator将保留一个内存池,并且不需要在每次调用construct时都进行系统调用;另一方面,每次调用时都由system
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 未定义模板"std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator&
- 返回的向量定义为 "std::vector<<error-type>, std::allocator<<error-type>>>
- 没有从"std::allocator"到"const allocator_type"的转换
- 为什么std::allocator这么快?
- Std::list抱怨缺少第二个模板参数(allocator)
- 为什么有两个std::allocator::construct函数?