c++ - 将多个类调用存储在一个变量中总是更快吗?

标签 c++ visual-studio optimization coding-style

如果你有这样的方法:

float method(myClass foo)
{
    return foo.PrivateVar() + foo.PrivateVar();
}

这样做总是更快/更好吗?:

float method(myClass foo)
{
    float temp = foo.PrivateVar();
    return temp + temp;
}

例如,我知道您不应该在 for 循环中调用 foo.PrivateVar() 这样的调用,因为它会多次求值,而您实际上只需要使用该值一次(在某些情况下。

for (int i = 0; i < foo.PrivateInt(); i++)
{
    //iterate through stuff with 'i'
}

据此,我假设将第一个示例中的代码更改为第二个示例中的代码,但后来人们告诉我不要试图比编译器更聪明!并且它可以很好地内联调用。

我不想介绍任何内容,我只想了解一些简单的规则,以便在这方面进行良好实践。我正在为工作申请编写演示,我不希望任何人在查看代码时看到一些菜鸟错误。

最佳答案

这完全取决于 PrivateVar() 正在做什么以及它在哪里定义等。如果编译器可以访问 PrivateVar() 中的代码并且可以保证那里通过调用它可以执行 CSE 的函数没有副作用,这基本上是您在第二个代码示例中所做的。

for 循环也是如此。所以如果你想确保它只被评估一次,因为它是一个非常昂贵的函数(这也意味着即使没有任何副作用,保证没有副作用也很棘手)明确地写下来。

如果 PrivateVar() 只是一个 getter,请编写更清晰的代码 - 即使编译器可能不执行 CSE,在 99.9999% 的所有情况下,性能差异也无关紧要。

编辑:CSE 代表 Common Subexpression eliminiation并且完全按照它所代表的去做 ;) 维基页面显示了一个简单乘法的示例,但我们也可以对更大的代码结构执行此操作,例如函数调用。

在所有情况下,我们都必须保证只评估一次代码不会改变语义,即为此代码执行 CSE:

a = b++ * c + g;
d = b++ * c * d;

并将其更改为:

tmp = b++ * c;
a = tmp + g;
d = tmp * d;

显然是非法的(对于函数调用,这显然要复杂一点,但原理是一样的)。

关于c++ - 将多个类调用存储在一个变量中总是更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750818/

相关文章:

c++ - 使用复杂的显示功能会阻止 glutKeyboardFunc 工作

c++ - 点对点线性渐变?

C++ "delete"很慢。我应该先看哪里?

c++ - 我正在使用 MS Visual C++ Express 为 C++ 寻找一个简单的套接字接口(interface)

c++ - 按 Enter 后如何防止命令行关闭

visual-studio - 为什么 VS2013 会重置垂直拆分的 XAML 窗口?

r - R 中的优化 : cost function with binary scheduling variables?

visual-studio - 如何在 Visual Studio 中更新我的自定义扩展而不需要先卸载它?

algorithm - 在 C++ 中寻找优化算法来替换 Excel Solver

performance - 图形:浮点累积图像的最佳性能