【发布时间】:2022-11-04 23:19:20
【问题描述】:
据我所知,在循环内声明变量的效率低于在外部声明并在循环内修改它。
例子:
std::list<<double> l;
for(int i = 0; i < 100000; ++i)
{
double a;
a = 500.0 * i;
l.append(a);
}
另一个带指针的例子:
std::list<<double *> l;
for(int i = 0; i < 100000; ++i)
{
double* a;
*a = 500.0 * i;
l.append(a);
}
这些示例没有足够的意义,但我只想表明在循环内声明了双精度和指针。
问题是,变量的作用域和循环是一样的,所以当循环进行迭代时,它会破坏变量然后再次声明它吗?或者它只是停留在堆中直到for 循环结束?这样做的效率如何?是不是很浪费资源?
我像在 C++ 中一样对其进行编码。
提前致谢!
【问题讨论】:
-
它将在堆栈而不是堆上(或者可能只是在寄存器中,根本不在主内存中)并且启用(并且可能没有)优化将生成相同的代码
-
您的假设(通常)是不正确的。然而,什么是不可取的是拆分声明和初始化。
-
始终您首先考虑的应该是最有意义的,而不是最有效的。如果一个变量在循环内使用并在循环的每次迭代中重新初始化,则在循环内声明它。
-
我的经验法则:使用尽可能小的范围。如果变量在循环之前或之后由代码使用,则在循环之前定义变量。如果变量只在循环中需要,但它的值需要在循环迭代之间携带(例如,任何迭代中的值取决于它在前一次迭代中的值)然后在循环构造本身中定义它(
for (int i = 0; ...是一个基本示例,其中i用于控制循环)。如果变量只需要在循环体中,并且它的值不依赖于之前的迭代,那么在循环体中定义它。
标签: c++ pointers variables memory-efficient