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++ 编译器会很有帮助地发出警告。