C++ 循环(while或for)中的变量是否在循环完成后处理?

C++ 循环(while或for)中的变量是否在循环完成后处理?,c++,variables,C++,Variables,在while或for循环中创建的变量是否在循环执行完成后从内存中释放/删除?另外,在循环中创建临时变量是否是一种不好的编码习惯 在这个例子中,它是创建100个X变量然后处理它们,还是在每次迭代中处理它们?谢谢 例如: int cc=0; 而(cc

在while或for循环中创建的变量是否在循环执行完成后从内存中释放/删除?另外,在循环中创建临时变量是否是一种不好的编码习惯

在这个例子中,它是创建100个X变量然后处理它们,还是在每次迭代中处理它们?谢谢 例如:

int cc=0;
而(cc<100){

int X=99;//是,当它们超出范围时将被销毁。请注意,这并不特定于循环中的变量。此规则适用于具有。

是的所有变量

如果希望在循环之后访问变量,则应将其声明为循环之外的变量

while(...) {
    int i = 0;
    i++; // valid
}
i++; // invalid, i doesnt exist in this context
int i = 0;
while(...) {
    i++; // valid
}
i++; // valid
i
循环外部

while(...) {
    int i = 0;
    i++; // valid
}
i++; // invalid, i doesnt exist in this context
int i = 0;
while(...) {
    i++; // valid
}
i++; // valid
可变变量的寿命仅限于创建它的上下文
{…}

如果我们考虑一个对象,当到达
}

Yes时会调用析构函数。在范围
{}
内定义的任何变量:

if(true){//请原谅我父亲的异端:)
int a=0;
}
a=1;//这将抛出一个错误
一旦超出范围,将自动解除分配

在这种情况下也是如此:

for(int i=0;i<10;++i){
//做事
...
}
i=1;//这将抛出一个错误

i
的作用域仅限于for循环,即使它没有在一对
{}

中声明,任何变量都会在其作用域内保持活动状态。在特定变量甚至不存在的范围之外,忘记访问它的值

for(;;)
{
    int var;  // Scope of this variable is within this for loop only.
}
// Outside this for loop variable `var` doesn't exits.

是的,这个变量被创建和销毁了N次,除非编译器以某种方式对它进行优化(我相信它可以)。不过,当你只有一个
int
时,这并不是什么大问题。如果在循环中有一些复杂对象被重新创建了99次,那么问题就更大了

一个小的实际例子:

#include <iostream>
using namespace std;

class TestClass
{
public:
    TestClass();
    ~TestClass();
};
TestClass::TestClass()
{
    cout<<"Created."<<endl;
}

TestClass::~TestClass()
{
    cout<<"Destroyed"<<endl;
}

int main() {
    for (int i = 0; i < 5; ++i)
    {
        TestClass c;
    }
    return 0;
}
#包括
使用名称空间std;
类TestClass
{
公众:
TestClass();
~TestClass();
};
TestClass::TestClass()
{
cout作用域和生存期是两件不同的事情。对于在块作用域中定义的变量,如果没有
static
,它们或多或少是紧密相连的,但它们仍然是不同的概念——如果你不保持它们的直线性,你可能会自食其果

引用问题中的片段:

int cc =0;
while(cc < 100){
    int X = 99; // <-- this variable
    cc++;    
}
int cc=0;
而(cc<100){

int X=99;//内部声明的变量将有自己的作用域。 当您知道不会在范围之外使用该变量时,可以使用它。
这就是编译器的工作。:

正如前面所指出的,实际上没有必要重复创建/销毁局部变量

这是不必要的CPU时间浪费

示例,使用“gcc-S-masm=intel-fverbose asm”编译

有趣的部分在于对注册RBP的引用。 一旦设置,它就不会改变。变量“i”总是在[rbp-4]。(代码的变化,有更多的变量等,给出了相同的结果=没有重复分配/解除分配=修改堆栈顶部位置)

这是最明智的做法:考虑一个迭代数万亿次的循环

另一个编译器会有不同的做法吗?可能是的,但是,它究竟为什么会这样做呢


安全性可能是一个问题?不太可能;在这种情况下,程序员只需在变量消失之前覆盖它。

“已处理”关于
int
变量/值是..不太令人兴奋,因为没有执行特殊的清理/销毁。在这种情况下,唯一感兴趣的是变量的可见性/范围。只有一个变量。不太可能没有变量,优化器可能会将值存储在CPU寄存器中。没有规范IAL清除,它只是在它恢复堆栈指针时“忘记”变量。重要的是,int必须是快速的。要获得洞察力最好的办法是查看编译器可以生成的程序集列表。与C++结合起来,是一个相当有问题的术语。它可以表示“销毁”,但是你应该写“销毁”。而不是“disposed”。或者它可能意味着其他东西。在您的问题中,“其他东西”可能是:编译器是否生成了重复分配和取消分配变量存储的代码。我最喜欢的答案是+1,用于解释对象构造函数/析构函数的示例。