在一个变量中存储多个类调用总是更快
is it always faster to store multiple class calls in a variable?
如果您有这样的方法:
float method(myClass foo)
{
return foo.PrivateVar() + foo.PrivateVar();
}
这样做总是更快/更好吗?:
float method(myClass foo)
{
float temp = foo.PrivateVar();
return temp + temp;
}
例如,我知道你不应该把foo.PrivateVar()
这样的调用放在for循环中,因为当你实际上只需要使用一次值时,它会对它进行多次评估(在某些情况下。
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 eliminization,并完全按照它所代表的来做;)wiki页面显示了一个简单乘法的例子,但我们也可以对更大的代码结构这样做,比如函数调用。
在所有情况下,我们都必须保证只对代码进行一次评估不会改变语义,即对该代码进行CSE:
a = b++ * c + g;
d = b++ * c * d;
并将其更改为:
tmp = b++ * c;
a = tmp + g;
d = tmp * d;
显然是非法的(对于函数调用来说,这显然有点复杂,但原理是一样的)。
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 使用另一个函数调用一个函数(都在类中)时出现问题.没有错误代码C++
- 为什么我可以调用一个从const方法更改成员的方法
- 如何在另一个.cpp文件中调用一个.cpp文件中的函数
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 使用线程从另一个成员函数调用一个Member函数
- 如何在另一个类中调用一个类的构造函数?
- 每 1 秒(准确地)调用一个函数
- 是否有一种方法可以调用一个函数,而不会创建变量,而不会创建变量
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- llvm 调用一个以 char * 作为参数的外部函数
- 它不是编译.我正在调用一个通过引用调用的函数,但有一个错误,无法将双*转换为双倍
- 如何在另一个函数中调用一个函数进行循环,同时通过函数传递数组
- 创建并调用一个空功能
- 是否有希望在std::变体上高效地调用一个公共基类方法
- Rcpp:从全局环境调用一个R函数,并在C++代码中使用它
- 每个线程或每个调用一个 ZeroMQ 套接字
- 虚幻c++使用LineTrace从Actor调用一个void
- 如何从另一个类调用一个类中的函数?(C++)