C++;重新生成循环中定义的变量? 当在C++中循环变量时,C++是否在循环的每个迭代中重新生成变量?我的意思是,它是否为另一个num变量重新分配内存?因此,如果循环迭代5次,是否会得到5个单独的num变量,它们有自己的唯一值?在循环开始之前声明一个变量是否更好,即使该变量只在循环内部使用?例如,如果我想将变量用作计数器或占位符,该怎么办 // is this better code? // int num; for (int i = 0; i < 5; i++) { int num; // do stuff with num } //这是更好的代码吗? //int-num; 对于(int i=0;i,初始化为任何特定值。因此,在这种情况下,一个典型的C++实现将简单地将这个代码> int 分配到内存中的某个地方,在每个地方循环使用。

C++;重新生成循环中定义的变量? 当在C++中循环变量时,C++是否在循环的每个迭代中重新生成变量?我的意思是,它是否为另一个num变量重新分配内存?因此,如果循环迭代5次,是否会得到5个单独的num变量,它们有自己的唯一值?在循环开始之前声明一个变量是否更好,即使该变量只在循环内部使用?例如,如果我想将变量用作计数器或占位符,该怎么办 // is this better code? // int num; for (int i = 0; i < 5; i++) { int num; // do stuff with num } //这是更好的代码吗? //int-num; 对于(int i=0;i,初始化为任何特定值。因此,在这种情况下,一个典型的C++实现将简单地将这个代码> int 分配到内存中的某个地方,在每个地方循环使用。,c++,loops,memory,C++,Loops,Memory,是,如果num是循环中的定义,则每次循环运行时它都将表示不同的变量。每次控件通过其定义时,它都将被重新初始化(如果有),并且每次循环的迭代结束时,它都将被销毁 变量通常应在尽可能狭窄的范围内声明。因此,如果num不需要在一次迭代到下一次迭代中保留其值,则通常应在循环中定义它。如果它确实需要在一次迭代到下一次迭代中保留其值,则必须在循环之外定义它 这种风格的最佳实践也有一些例外,例如当初始化成本很高时。编译器可能会优化内存使用,因此该变量只在物理上分配一次,然后在每次循环迭代中重新使用。但是,一般

是,如果
num
是循环中的定义,则每次循环运行时它都将表示不同的变量。每次控件通过其定义时,它都将被重新初始化(如果有),并且每次循环的迭代结束时,它都将被销毁

变量通常应在尽可能狭窄的范围内声明。因此,如果
num
不需要在一次迭代到下一次迭代中保留其值,则通常应在循环中定义它。如果它确实需要在一次迭代到下一次迭代中保留其值,则必须在循环之外定义它


这种风格的最佳实践也有一些例外,例如当初始化成本很高时。

编译器可能会优化内存使用,因此该变量只在物理上分配一次,然后在每次循环迭代中重新使用。但是,一般来说,YES,作用域规则要求每个循环迭代对变量的不同实例进行操作。在复杂类型的情况下,比如类/结构,即在每个循环迭代上调用变量上的构造函数和析构函数。

在您概述的情况下,C++标准指定变量的新实例在循环的开始时被构造,在循环结束时被破坏。

当你深入到它的本质时,实际发生的事情并不是重点。允许C++实现以它想要的任何方式实现,只要可观察结果是由C++标准指定的。 在这里,您只需要一个普通的花园品种
int
。正如我所描述的,虽然它是被正式构造和销毁的,但当变量被构造和销毁时,实际上什么都没有发生。在局部范围内,C++不需要新构造的<代码> int /COD>,初始化为任何特定值。因此,在这种情况下,一个典型的C++实现将简单地将这个代码> int <代码>分配到内存中的某个地方,在每个地方循环使用。
但是,如果您要用一个更充实的对象替换这个
int
,使用一个正式的构造函数,您将看到对象的构造函数将在每个循环迭代开始时被顺从地调用,而对象的析构函数将在循环迭代结束时被顺从地调用(或者当执行线程离开循环的作用域时)。

这是一个新变量。您可以通过以下事实轻松说服自己:

for (int i = 0; i < 5; i++) {
  const int num = i;
  // do stuff with num
}
for(int i=0;i<5;i++){
常数int num=i;
//用num做一些事情
}
如果它真的是同一个变量,我们如何给常数变量赋值

至于是否有效率,你应该记住C++有很好的优化编译器,没有真正的“成本”。与堆栈变量关联。一个简单的整数赋值显然没有任何副作用,因此编译器重用相同的空间是微不足道的。如果不需要循环外的变量,最好在循环内声明它

我建议使用来查看为几个小函数生成的程序集(有优化和没有优化),它将让您了解编译器可以轻松优化的内容