定义变量的最佳位置在哪里?

Emr*_*reS 4 variables performance location scope definition

我想知道下面的代码对于性能有什么区别吗?例如,有三个变量,每个变量都定义了何时使用。

    bool myFunc()
    {
        string networkName;
        if ( !Parse(example, XML_ATTRIBUTE_NAME, networkName) )
        {
            return false;
        }

        BYTE networkId;
        if ( !Parse(example, XML_ATTRIBUTE_ID, networkId) )
        {
            return false;
        }

        string baudRate;
        if ( !Parse(example, XML_ATTRIBUTE_BAUDRATE, baudRate) )
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面和下面的代码在性能方面有什么区别吗?

    bool myFunc()
    {
        string networkName;
        string baudRate;
        BYTE networkId;

        if ( !Parse(example, XML_ATTRIBUTE_NAME, networkName) )
        {
            return false;
        }

        if ( !Parse(example, XML_ATTRIBUTE_ID, networkId) )
        {
            return false;
        }

        if ( !Parse(example, XML_ATTRIBUTE_BAUDRATE, baudRate) )
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

kef*_*500 7

代码可读性

\n\n
    \n
  • 建议的做法是将声明尽可能靠近使用变量的第一个位置。这也最小化了范围。\n摘自Steve McConnell 的《Code Complete》一书:

    \n\n
    \n

    理想情况下,声明和定义每个变量应靠近首次使用的位置。声明建立变量\xe2\x80\x99s 类型。定义为变量分配特定值。在支持它的语言中,例如 C++ 和 Java,变量的声明和定义应靠近首次使用的位置。理想情况下,每个变量应该在声明的同时定义。

    \n
  • \n
  • 然而,很少有资料来源建议将声明放在块的开头 ( {})。\n来自过时的 Java 代码约定

    \n\n
    \n

    仅将声明放在块的开头。(块是由大括号“{”和“}”包围的任何代码。)不要等到第一次使用变量时才声明它们;它可能会让粗心的程序员感到困惑并妨碍代码在范围内的可移植性。

    \n
  • \n
  • 在函数顶部声明变量被认为是不好的做法。将声明放在最本地的块中。

  • \n
\n\n
\n\n

表现

\n\n
    \n
  • 事实上,这取决于。声明 POD 类型根本不应该影响性能:所有局部变量的内存都是在调用函数时分配的(CJavaScriptActionScript...)。

  • \n
  • 请记住,编译器会优化您的代码,因此我猜非 POD 类型也不会成为问题 ( C++)。

  • \n
  • 通常选择声明变量的位置是一种过早的优化,因此性能在这里并不重要,因为它的微观提升(或开销)微不足道。主要的争论仍然是代码的可读性

  • \n
\n\n
\n\n

附加说明

\n\n
    \n
  • C99在(语言)标准之前C,必须在块的开头声明变量。
  • \n
\n\n
\n\n

总结

\n\n
    \n
  • 考虑到上述情况,最好的方法(但仍然不是强制性的)是声明变量尽可能靠近其第一次使用的位置,保持范围干净。
  • \n
  • 一般来说,这只是代码可读性的问题。
  • \n
\n