【问题标题】:CppCheck. The scope of the variable can be reduced (and loop)Cpp检查。变量的范围可以缩小(和循环)
【发布时间】:2014-06-29 13:26:13
【问题描述】:

CppCheck 为我找到了一些发现,例如:“变量 'x' 的范围可以缩小”。

如果我有这种情况怎么办:

int x;
for (int i = 0; i != 10; ++i)
{
    x = someFunction();

    // ... I use x variable here
}

我认为我的代码没问题。你怎么看?应该改成这样吗?

for (int i = 0; i != 10; ++i)
{
    int x = someFunction();

    // ... I use x variable here
}

在第二个代码中,为所有迭代定义了一个变量 x……我猜这不是很好(不是最优的)……

【问题讨论】:

  • 我认为在使用前和最内部的范围内声明变量是一个好习惯。

标签: c++ c performance coding-style cppcheck


【解决方案1】:

如果变量 x 没有在循环外使用,那么第二种方法要好得多。而且代码的优化也没有丝毫问题。变量的内存在循环中只分配一次。

【讨论】:

  • 为变量分配堆栈内存将发生在函数的开头,而不是循环中。 x 的初始化将在循环中进行。但我正在分裂头发。
  • 不是原始类型怎么样,例如 std::string?一样吗?
  • @pawell55555 非原始类型可能会导致性能下降。我刚刚尝试了一个不平凡的课程,而 Cppcheck 错误地坚持同样的 style 问题。
  • @pawell55555 我添加的答案也涵盖了这个问题。
【解决方案2】:

int 声明的位置对性能没有影响,因此 Cppcheck 在提出此样式问题时是正确的。这个样式问题也可以应用于非平凡的类型,

for (int i = 0; i != 10; ++i)
{
    MyType x = someFunction();

    // ... I use x variable here
}    

因为构造函数往往与赋值一样有效。从 1.65 版开始,Cppcheck 似乎不区分普通类型和非普通类型。

但不要盲目地遵循这样的风格建议,会有非平凡类型的情况下赋值比构造更有效。 (和往常一样:如果对性能有疑问,请测量!)

编辑:风格考虑

第二个变体在风格上更好,因为它结合了声明和初始化:

  • 这通常可以避免您编写(或阅读)没有意义的评论。
  • 有时还可以添加const,防止意外更改

【讨论】:

    【解决方案3】:

    正如其他人所提到的,对于普通类型,它不太可能对性能产生重大影响。

    但是,您还应该考虑到,通过缩小范围,您可以通过使声明更接近用法来提高可读性,并且可能更重要的是,使其更易于重构。

    在考虑可维护性时,这两者都可能很重要。

    我们都知道我们应该保持函数的简短和良好的重构,但是我们都见过那些 5000 行长的怪物,其中一个变量被声明在顶部,并且使用了一次,在 3789 行中。如果 你 没有,可怜我们其他人。

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2013-06-12
      • 2016-12-06
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 2016-10-14
      相关资源
      最近更新 更多