VS2010 C++/C#编译器能否优化掉循环内部声明的变量?

Ham*_*jan 2 c# c++ performance coding-style

我在我的位置上很新,所以在表达担忧之前我应该​​三思而后行,但我看到的一些代码......

当我试图提高可读性时,我被告知并不总是有时间,效率更重要.

但后来我看到不同类型的循环中的变量重新声明,有时下降到两个级别.我的一部分认为 - 不要那样做!但另一部分说 - 无论如何,这个复杂的功能应该分解成几个功能.那些较小的函数可以有临时变量,编译器应该能够处理它们.

然后函数调用会增加一些额外的成本.让我试着想出两个例子:

Class1::Do1()
{
    for (int i = 0; i < 100; i++)
    {
        bool x = GetSomeValue();
        ...
        if (x)
        {
            ...
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

VS

Class1::Do1()
{
    bool x = false;
    for (int i = 0; i < 100; i++)
    {
        x = GetSomeValue();
        ...
        if (x)
        {
            ...
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

VS

Class1::Do1()
{
    for (int i = 0; i < 100; i++)
    {
        Do2();
    } 
}

Class1::Do2()
{
    bool x = GetSomeValue();
    ...
    if (x)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

第一种方式对我来说是错误的,当我自己编写代码时,我总是喜欢第二种甚至第三种.我认为由于额外的函数调用,第三种方式可能会更慢.第一种方式有时甚至可能看起来粗略 - 如果函数很长,声明将远离使用它的位置.另一件事是我的例子太简单了 - 编译器可能想出如何简化,也许可以内联所有3.不幸的是现在我不记得其他我认为是邋iness的例子,只是想提一下变量是重新声明n*m次,因为它们是两级深度(在2个循环内).

魔鬼的拥护者说 - 你怎么知道100%这可能效率不高?我的纯粹主义者(我的版本)认为一遍又一遍地重新声明同一个变量是愚蠢的 - 至少在阅读代码时它会抛出一个.

思考?有问题吗?

Bro*_*ass 7

据我所知,所有局部变量都在方法调用开始时分配了堆栈空间,因此无论是在循环内还是在循环之前声明变量都无关紧要.

在这种情况下,我会编写可读性代码 - 如果你不需要循环外的变量,我个人会在循环中声明它,以使它更接近实际使用它的代码并减少变量的范围尽可能.