方法链慢C ++?

时间:2015-01-02 14:49:40

标签: c++ compiler-optimization

例如,其中哪一个更快:

if(object.GetMemberX().IsSomething())
{
    Store(object.GetMemberX());
    object.GetMemberX().FlagSomething();
}

typeX x = object.GetMemberX();
if(typeX.IsSomething())
{
    Store(x);
    x.FlagSomething();
}

我想如果GetMemberX()返回指针或引用,那么在第一个示例中,编译器无法优化掉两个调用,因为它无法保证返回的指针/引用对于每个调用都是相同的调用

但是在第二个例子中我存储它?

如果这是真的,它是否只适用于返回指针/引用的方法?如果我的方法按值返回,它们会受到不同调用的影响吗?

2 个答案:

答案 0 :(得分:5)

这个问题在C ++通用上下文中无法解答...因为它取决于编译器实现和优化级别!

您甚至无法确定特定优化级别的特定编译器是否会为这两个版本生成完全相同的代码,因为最终操作应该是相同的。

我的建议是只使用通用规则:首先编写可读的代码(由您和可能的同行编写......)。当出现性能问题时,对程序进行分析并仅优化应得的小部件,始终通过对不同可能性进行基准测试。

当然,上述问题主要是低级优化,就像你在这里问的那样。你应该总是选择与预期用法相符的算法...

答案 1 :(得分:2)

第二个版本更具可读性。但是,它可能会调用typeX的复制构造函数。要快速读取,请使用引用或指针:

typeX& x = object.GetMemberX();
if(typeX.IsSomething())
{
    Store(x);
    x.FlagSomething();
}

唯一不使用引用的情况是object.GetMemberX()按值返回时,在这种情况下,第二个版本是可行的方法。在这种情况下,存储返回值不会产生开销,因为编译器可以优化副本(复制省略)。