关于c#:是否有性能增益或之前声明所有局部变量的其他原因?

Is there performance gain or another reason for declaring all local variables before?

我在我们的代码库和在线上也看到了这种风格,在这里,如果您有一个带有for循环的函数,以及if语句,那么只有它们使用的所有变量和它们之外的任何其他变量都不会被声明。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void process()
{
    int i;
    int count = 100;
    vector3 point;
    vector sum;

    for (i = 0; i < count; ++i)
    {
        import(this,"pos", point);
        sum += point;
    }
    sum /= count;
}

或者这是过早的优化?我对C++、C语言和Python感到好奇,它们是我使用的语言,也是我一次又一次看到这些语言的地方。


很多旧的代码都这样做,因为C89/90中需要它。好吧,从技术上讲,从来没有要求在函数的开头定义变量,只在块的开头。例如:

1
2
3
4
5
6
7
8
9
10
11
12
int f() {
    int x;   // allowed

    x = 1;
    int y;   // allowed in C++, but not C89

    {
       int z=0;    // beginning of new block, so allowed even in C89

       // code that uses `z` here
    }
}

C++从未有过这种限制(C也没有过相当长的一段时间),但是对于一些旧习惯来说很难。对于其他人来说,在代码库中保持一致性超过了在使用变量的位置附近定义变量的好处。

就优化而言,这些通常都不会有任何效果。


它在python中有不同之处。这是一个范围问题,Python将首先搜索包含局部变量的字典,然后向上搜索全局变量,然后再搜索内置变量。

在python中,这有一个轻微的速度增长,尽管通常不会太快。检查这个问题以了解关于python的更多细节,包括一些测试。

我不能评论C++或C语言,但因为它们是编译语言,这不重要。


这没什么区别。不管是哪种方式,它都在堆栈上。