空.ctor和.dtor会降低性能吗?

时间:2013-11-21 21:13:14

标签: c++ constructor destructor

在下面的示例中,test1类没有ctor/dotrtest2为空ctordtor

在分配大量test1test2时,空ctordtor会降低效果吗?

#include <cstdlib>

using namespace std;

class test1
{
public:

    int m_member;

    // Without ctor/dtor
};

class test2
{
public:

    int m_member;

    // Empty ctro
    test2(void)
    {
        // Nothing.
    }

    // Empty dtor
    ~test2(void)
    {
        // Nothing.
    }
};

int main(int argc, char* argv[])
{
    // Which one of these lines is faster?
    test1* t1 = new test1[500 * 1024 * 1024];
    test2* t2 = new test2[500 * 1024 * 1024];

    return EXIT_SUCCESS;
}

修改: 我相信测试这段代码并不容易,因为分配大量内存会影响程序的下一行和系统速度。

2 个答案:

答案 0 :(得分:4)

这是不太可能的 - 特别是因为你的构造函数和析构函数是内联的,所以编译器可以优化它们。话虽如此 - 为什么不测量它而不是询问Stack Overflow?

答案 1 :(得分:3)

我在代码中包含C ++ 11 chrono函数后对其进行了基准测试。 相对速度依赖于编译器优化开关。 当使用没有优化的Gnu编译器编译时(g ++ -std = c ++ 11 -O0),在我的笔记本电脑上使用i7 cpu(us = microseconds)完成test2的分配大约需要27倍(~100 us vs 2700 us)。与此相反,更高级别的优化(g ++ -std = c ++ 11 -O2)使得test1的分配比test2分配花费大约9倍(~90 us vs 10 us)。每次运行都会有所不同。这是相关的修改代码:

steady_clock::time_point start1, end1, start2, end2;
start1 = steady_clock::now();
test1* t1 = new test1[500 * 1024];
end1 = steady_clock::now();

start2 = steady_clock::now();
test2* t2 = new test2[500 * 1024];
end2 = steady_clock::now();
cout<<duration_cast<microseconds>(end1 - start1).count()<<endl;
cout<<duration_cast<microseconds>(end2 - start2).count()<<endl;

分配时间的这种巨大差异有些出乎意料,因为默认的ctor和dtor可能是空的。

编辑:正如Dale在下面的评论中所建议的那样,我根据切换顺序做了额外的基准测试。 -O0标志将执行时间更改为(~15 us vs 2800 us)。使用-O2标志执行时间为(~10 us vs~80 us)。多次运行的标准偏差时间相对较大,但速度顺序保持不变。