8

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 ......我猜这不是很好(不是最优的)......

4

3 回答 3

10

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

于 2014-05-12T08:55:35.667 回答
9

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

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

    // ... I use x variable here
}    

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

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

编辑:风格考虑

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

  • 这通常使您免于编写(或阅读)不是很有意义的评论。
  • 有时您还可以添加const,这样可以防止您意外更改
于 2014-06-05T10:25:49.453 回答
5

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

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

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

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

于 2014-06-05T16:21:35.000 回答