C++内存堆栈/寄存器范围
C++ memory stack/register scope
我有以下代码。
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
不会有什么不同。
但你不必担心。优化编译器非常能够处理变量生存期并优化内存与寄存器的分配。
在给定代码段的情况下,毫无疑问,累加器将保留在寄存器中,除非寄存器堆栈完全繁忙。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- xmm 寄存器中的__m128何时?
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- C++内存堆栈/寄存器范围