我应该更改函数参数的值吗?

时间:2016-04-04 12:39:58

标签: c++ c function parameters

我知道这在C中是允许的,但我习惯不更新由值传递的变量的值。

在我的编码风格"中,不会更改按值传递的参数。 我的意思是我更喜欢这个:

void func(int var)
{
    int locVar = var;

    if(something)
    {
        locVar = locVar/2;
    }

    // [some stuff using locVar]
}

对此:

void func(int var)
{
    if(something)
    {
        var = var/2;
    }

    // [some stuff using var]
}

我认为如果启用了寄存器优化,编译器将不会产生不同的汇编,但是,是否有任何理由偏好这两个代码段之一?

3 个答案:

答案 0 :(得分:1)

没有

  • 从计算机的角度来看 - 没有区别。优化将完成这项工作。
  • 从个人的角度来看 - 品味
  • 从元视图 - 不要设置陷阱

通常在函数中需要多次初始参数值,因此更常见的样式不是覆盖参数。在catch子句中使用可用于调试,记录消息(“写入n字节”)的值非常方便。由于这或多或少是常见的风格,维护人员很容易错过你的不成熟 - 过早优化。这种优化在非优化C编译器时代很常见,现在它们只是“因为我可以”的东西。请记住,我们编写的代码可供人类阅读。编译器无论如何都可以做到这一点。

答案 1 :(得分:1)

  

有没有什么理由可以选择两个代码段之一?

1)编译器不是平等的。 int locVar = var; 可以创建更快的代码。 (我很惊讶在给定的应用程序中发现这是真的。)这是本地或微优化,仅在特定情况下有用,当然,当使用其他选项或在另一台机器上编译时,可能会产生不同的性能。

2)越少越好。在int locVar = var;中引入同义词是需要理解和维护的更多代码和更多变量。 通常这不太有帮助。

3)两个代码段都生成有效代码。所以这也是一个风格问题。如果您的编码组有关于此的编码指南,那么最好遵循这一指导原则,而不是因为微不足道的原因而不同。

选择理由优先选择其中一个:是的。有充分理由:一般没有。如果对哪种方式有疑问,那么容易维持的就是胜利(IMO)。

答案 2 :(得分:0)

一般来说,引入的变量越多,代码的可读性就越低,也就越复杂。

有时甚至很难为一个实体创建两个名称,从语义上看它们看起来完全相同。

例如,功能列表可以占用多个屏幕。在这种情况下,如果您遇到类似locVar的名称,则需要向后滚动功能列表以确定此名称的含义。

此外,一个函数可以有几个参数。你打算为每个参数引入新的别名吗?

对于您的代码的读者,您不会清楚为了支持您的编码风格而引入了新的局部变量。例如,他们可以认为您更改了函数并忘记删除不再需要的变量。:)

例如,考虑一个计算数字位数之和的递归函数。

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int digit = x % Base;
    return digit + ( ( x /= Base ) == 0 ? 0 : sum( x ) );
                        ^^^^^^^^^^^^^
} 

或者可以写成

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 

在此函数中引入新的局部变量作为x的别名的目的是什么?

unsigned int sum( unsigned int x )
{
    const unsigned int Base = 10;

    unsigned int y = x;
    unsigned int digit = y % Base;
    return digit + ( ( y /= Base ) == 0 ? 0 : sum( y ) );
} 

对于我来说,没有中间变量y的第一个函数实现更清楚。当使用相同的变量x时,函数的递归性质更加明显。

如果要指出函数中没有更改参数,可以使用具有限定符const的参数声明或定义函数。

例如

unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 

在C ++中,函数调用看起来像

#include <iostream>

constexpr unsigned int sum( const unsigned int x )
{
    const unsigned int Base = 10;

    return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
} 

int main()
{
    std::cout << sum( 123456789 ) << std::endl;
    int a[sum( 123456789 )];

    std::cout << sizeof( a ) << std::endl;
}    

程序输出

45
180