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

C++ memory stack/register scope

本文关键字:寄存器 范围 堆栈 内存 C++      更新时间:2023-10-16

我有以下代码。

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加载到/处理为寄存器?

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

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

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

我问这个是因为for循环创建了一个局部变量,i,因此tmpC和tmpA在for循环的范围内可能不再是"局部的"。

不切题的。

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

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

这个问题本质上是无关紧要的,因为累加器变量必须在 for 循环之外声明/初始化,并且在循环中使用它们。没有什么是你可以改变的,一个while不会有什么不同。

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

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