我有以下代码。
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加载到/处理为寄存器?
答案 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
没有任何区别。
但你不用担心。优化编译器能够处理可变的生命周期并优化内存与寄存器的分配。
在给定片段的情况下,毫无疑问累加器将保留在寄存器中,除非寄存器堆栈完全忙。