Foreach 循环比传统的 for 循环使用更多的堆栈内存?
Foreach loop uses more stack memory than traditional for loop?
在我的一个程序中,我使用了一个与此类似的 for each 循环
for(auto component : components) {
doSomethingWithComponent(component);
}
和 visual studio 抱怨说这会导致函数使用的堆栈内存超过最大值,所以我将循环更改为:
for(int i = 0;i<components.size();i++) {
doSomethingWithComponent(components[i]);
}
警告消失了。这是因为 for each 循环会生成循环中对象当前迭代的 reference/copy 吗?但如果是这样的话,我不认为具有几个整数的单个结构会消耗那么多内存?发生这种情况有原因吗?
编辑:
components
是一个 std::vector
如果它改变了什么
for(auto component : components) {
这相当于拥有
auto component=components[i];
在循环的每次迭代中执行。在循环的每次迭代中,由容器中的每个值组成一个(大部分无用的)副本。因此堆栈使用。
只需使用引用即可避免这种情况:
for(auto &component : components) {
更好的是,如果循环不应该修改容器的内容:
for(const auto &component : components) {
如果循环由于错误而试图修改容器中的值,您的 C++ 编译器会很有帮助地发出警告。
在我的一个程序中,我使用了一个与此类似的 for each 循环
for(auto component : components) {
doSomethingWithComponent(component);
}
和 visual studio 抱怨说这会导致函数使用的堆栈内存超过最大值,所以我将循环更改为:
for(int i = 0;i<components.size();i++) {
doSomethingWithComponent(components[i]);
}
警告消失了。这是因为 for each 循环会生成循环中对象当前迭代的 reference/copy 吗?但如果是这样的话,我不认为具有几个整数的单个结构会消耗那么多内存?发生这种情况有原因吗?
编辑:
components
是一个 std::vector
如果它改变了什么
for(auto component : components) {
这相当于拥有
auto component=components[i];
在循环的每次迭代中执行。在循环的每次迭代中,由容器中的每个值组成一个(大部分无用的)副本。因此堆栈使用。
只需使用引用即可避免这种情况:
for(auto &component : components) {
更好的是,如果循环不应该修改容器的内容:
for(const auto &component : components) {
如果循环由于错误而试图修改容器中的值,您的 C++ 编译器会很有帮助地发出警告。