如果你有这样的方法:
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/