直接使用函数参数vs创建局部变量

Using function arguments directly vs Creating local variables

本文关键字:vs 创建 局部变量 参数 函数      更新时间:2023-10-16

考虑一个函数的这两种实现:

double MyFoo::foo(std::vector<double> & v){
    double f1 = v.at(1);
    double f2 = v.at(2);
    double f3 = v.at(3);
    double f4 = v.at(4);
    double f5 = v.at(5);
    double f6 = v.at(6);    
    double ret = sin(f1)+ sin(f2)+ sin(f3)+ sin(f4)+ sin(f5)+ sin(f6)+ sin(f7);
    return ret;
}

double MyFoo::foo(std::vector<double> & v){
    double ret = sin(v.at(1))+ sin(v.at(2))+ sin(v.at(3))+ sin(v.at(4))+ sin(v.at(5))+ sin(v.at(6))+ sin(v.at(7));
    return ret;
}

这些函数的执行时间是否有明显差异(如果有的话)?这些局部变量赋值会带来计算开销,还是编译器会处理无用的局部变量?

注:sin()的选择完全是任意的。我的问题集中在局部变量上,而不是内部发生的操作。

如果没有实际构建一个这样做的系统,我猜根本没有区别。无论如何,sin往往需要花费相当多的时间,所以很可能在使用局部变量等方面进行的任何小优化都是非常微不足道的。

我希望大多数"好的"编译器(gcc, Microsoft等)会优化出没有被广泛使用的任何局部变量,并产生完全相同的代码。

但就像我说的,没有实际尝试这两种方法,很难这么说肯定[我也会删除对sin的调用,因为这可能会"隐藏"两个变体之间的任何微小差异-只是添加6双值将是一个更好的解决方案]。

如果性能(特别是在这个函数中)很重要,那么生成一个基准。但是,在开始"搞乱"函数之前,请确保您知道哪些函数在代码中消耗了大部分时间。当整个执行时间是几个小时(数十亿个周期)时,从一个运行了几十次的函数中削减两个时钟周期没有多大意义。