-1

我有以下代码。

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];
}

其中作弊者和利他主义者在文件中具有全局范围,而tempC 和 tmpA在 setCoin() 函数中具有局部范围。

即使代码进入for循环,tmpC 和 tmpA 也会被加载到/视为寄存器吗?

我问这个是因为for循环创建了一个局部变量 ,i因此 tmpC & tmpA 在 for 循环的范围内可能不再是“本地”的。将此for循环更改为while循环是否可以解决此问题并将 tmpC 和 tmpA 加载到/视为寄存器?

4

3 回答 3

1

即使代码进入for循环,tmpC 和 tmpA 也会被加载到/视为寄存器吗?

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

我问这个是因为for循环创建了一个局部变量 i,因此 tmpC 和 tmpA 在for

无关紧要。

将此 for 循环更改为 while 循环是否可以解决此问题并将 tmpC 和 tmpA 加载到/视为寄存器?

没有什么可以修复的。优化器会或不会根据自己的规则将 tmpA/tmpC 放入寄存器中,这与内部作用域的存在与否无关。

于 2013-11-11T01:10:21.797 回答
1

你不能确定,你必须编译它然后反汇编才能确定是否使用了寄存器。不过,循环的类型并不重要。

于 2013-11-11T00:55:23.393 回答
0

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

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

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

于 2016-08-07T16:04:49.253 回答