0

我认为访问 C++ 标准库的实现是不切实际的,因为它依赖于平台(如果这句话错了,请纠正我!)。好吧,我想在 C++ 中练习一些非常低级别的东西(至少,我可以用 C++ 编程的低级别)。所以,我开始编写一个分配器类,只是为了练习、学习,如果我创造了一些有用的东西,我计划在我的实际项目中使用它。

我的课看起来还不错。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:应用程序。1.450 秒
测试 3:应用程序。1.200 秒
(注意:这些数字是近似数字)

好吧, std::allocator 比两者都快。也许没有很大的区别,但我想知道这种区别的原因。我对std::allocator的实现很好奇。感谢您的帮助和时间。



附加信息:我在 Ubuntu Quantal Quetzal 下使用 GCC 4.7.2。

4

2 回答 2

1

std:allocator 将保留一个内存池,并且不需要每次调用构造时都进行系统调用,另一方面,每次我们执行新内存时,系统都会分配新内存

于 2013-05-10T18:26:13.287 回答
1

您将不得不学习分支预测和 CPU 流水线、用于内部实现的低时间复杂度算法以及缓存一致性,以便进行高度优化。我不知道std::allocator's 的实施,但从你的问题来看,我提到的事情是显着提高性能的领域。

编辑:如果std::allocator使用newdelete喜欢评论所建议的,那么很容易通过一些内存池制作一个更具体和优化的分配器。

于 2013-05-10T18:20:59.533 回答