C ++内存堆栈/寄存器范围

时间:2013-11-11 00:47:16

标签: c++

我有以下代码。

void setCoin() {
    int coin;
    int tmpC = 0;
    int tmpA = 0;
    for(unsigned int i = 0; i < GRPS.size(); i++) {
        coin = workerCoin();
        GRPS[i].choice = coin;

        //printf("\n| group: %d |%d|", GRPS[i].size, coin);
        if(coin) {
            tmpC += GRPS[i].size;
        }
        else {
            tmpA += GRPS[i].size;
        }
    }
    cheaters = tmpC;
    altruistic = tmpA;
    grp = GRPS[GRPS.size() / 2];
}

骗子&amp;利他主义在文件中有一个全局范围, tempC&amp; tmpA 在setCoin()函数中具有局部范围。

tmpC&amp;即使代码进入for循环,tmpA也可以作为寄存器加载/处理?

我问这个是因为for循环创建了一个局部变量i,因此tmpC&amp; tmpA可能不再是for循环范围内的“本地”。将此for循环更改为while循环会修复此问题,并将tmpC&amp; tmpA加载到/处理为寄存器?

3 个答案:

答案 0 :(得分:1)

你无法确定,你必须编译它然后反汇编以找出是否使用了寄存器。但是,循环的类型无关紧要。

答案 1 :(得分:1)

  

tmpC&amp;即使代码进入for循环,tmpA也可以作为寄存器加载/处理?

“for”循环没有任何区别。

  

我问这个是因为for循环创建了一个局部变量i,因此tmpC&amp; tmpA可能不再是for循环范围内的“本地”。

不相关。

  

将这个for循环更改为while循环可以修复此问题并使用tmpC&amp; tmpA加载到/处理为寄存器?

没有什么可以解决的。优化器将根据自己的规则将tmpA / tmpC放入或不放入寄存器,这些规则与内部范围的存在与否无关。

答案 2 :(得分:0)

问题基本上是无关紧要的,因为累加器变量必须在for循环之外声明/初始化,并且它们在其中使用。没有什么是你可以改变的,while没有任何区别。

但你不用担心。优化编译器能够处理可变的生命周期并优化内存与寄存器的分配。

在给定片段的情况下,毫无疑问累加器将保留在寄存器中,除非寄存器堆栈完全忙。