c++表达式——两者中哪一个更快

C++ expressions - which one of the two is faster?

本文关键字:哪一个 表达式 c++      更新时间:2023-10-16

我一直在尝试c++,我对两个脚本的性能特别感兴趣。一个小介绍:

我有一个叫做Point的类,用来实验极坐标中给出的点。该类包含两个私有双变量,通常的函数get、set和公共函数rotate,后者接受一个双参数,并将其以极坐标形式加到当前角度,生成一个新的Point对象。

下面是rotate函数的两个不同脚本:
void Point::rotate(double theta) {
    double A = getA();
    A += theta;
    setA(A);
}
void Point::rotate(double theta) {
    setA(getA() + theta);
} 

我的问题很简单:

哪一个实际上更快,为什么?

我知道第一个方法必须使用getA(),然后将其保存到变量A中,所以最有可能的是,它需要更长的时间/效率更低。更一般地说,在计算表达式时,是否需要将表达式的大部分保存在其他变量中,然后再使用它们?(夸张地假设编写代码的"人"不会犯错误,并且以后需要阅读代码的每个人都能完全理解它。)

一个简单的例子来澄清我的问题:

假设我们想计算a+b+c。把a+b存到一个新变量里,比如d,然后把d加到c里,是不是更好?如何调用一个函数与参数另一个函数求值?

提前感谢!

这两个表达式是相同的。理想情况下,您可以始终运行基准测试,在循环中多次调用表达式并查看时差。

然而,另一种看待它的方式是通过回答问题的第二部分,这是关于a+b+c的。当代码被翻译成汇编时,a+b无论如何都会被存储在某个寄存器中,然后添加到c,因为汇编中没有3位数加法的操作。因此,在:

中不会有区别
c =  a + b + c

d = a + b
c = c + d

同样,许多其他优化是由编译器完成的,这导致这些事情没有什么不同。