这是一个例子:
while (i < 10)
{
int j = 1;
string k = "hello.";
}
j是原始数据类型,k是对象 . 根据Do built-in types have default constructors?,
因此非类类型(包括基本类型,数组类型,引用类型,指针类型和枚举类型)没有构造函数 .
并根据Declaring Variables inside Loops, good practice or bad practice? (2 Parter),
在对象(例如std :: string)的情况下,必须在每次迭代时执行构造函数和析构函数 .
但是,variable declaration within the while loop C/C++说,
while(i--)
{
int i = 100; //每次输入循环时都会创建
一世 - ;
的printf( “%d ..”,i)的;
} //循环中的i在这里不断被破坏
我已经了解到,当调用函数时(例如操作系统的 main()
),所有局部变量都在函数的开头创建,并在函数结束时销毁 . 上面的while循环引用表示原始数据类型 i
在while循环块中声明时被创建,并在while循环块的末尾为每次迭代销毁 .
这是真的吗? #1 在while循环块中声明的原始数据类型是为while循环的每次迭代分配的吗? #2 我错误地假设while循环中的这些声明应该在函数的开头创建while循环块包含在?
我正在寻找一个详细的解释,不只是是或否 .
3 回答
逻辑上,是的,变量是在循环体的开始处为循环的每次迭代创建的,并在最后被销毁 .
在你的第一个例子中,每次迭代都将调用
std::string
的构造函数(实际上是std::basic_string<char>
,这是std::string
),析构函数也是如此 . 类似地,j
正在创建并在每次迭代时设置为1
.在第二个示例中,
i
将以相同的原因打印值99
.编译器确实有一些余地 . 如果他们能够检测到没有重复创建和销毁的效果,他们可以保持变量存活,并简单地为每次循环迭代重新初始化它 . 它们甚至可以完全消除变量(例如,只重复打印99,而不是创建变量) . 但是,这样的事情是不可靠的,程序无法测试是否发生 .
程序的行为必须像每次循环时重新分配(然后解除分配)一样 .
程序展示该行为完全取决于编译器的机制 . 在许多情况下,根本不会为变量分配任何空间,或者甚至根本不存在空间! (例如你的第一个例子中的
j
)如果空间确实被分配,我认为它必然是专门保留的)
是的,当你在循环中声明一个变量时,程序就像在每次循环迭代中创建和销毁变量一样 . 因此,如果变量具有类类型,则程序的行为就像每次调用其构造函数和析构函数一样 .
但是,由于优化,可以消除不可观察的行为,因此第一个循环可以完全优化掉,第二个循环可以优化到类似的东西
因此可能会发生没有创建实际变量的情况 .