2

我最近开始使用基于范围的 for(在获得编译器功能之后)。我注意到使用基于范围的首选形式是:

for(const auto& it: container) {...}

这对于任何大于 int 的类型都是有意义的。但是,如果容器包含原始指针(这是我的情况)或更小的类型怎么办?

具体来说,我想知道的是:

1) 请求引用而不是(可能)较小的副本是否可能会导致性能损失?如果类型的大小正好等于本机指针的大小怎么办?

2)相反,不使用参考是否可能会导致性能损失?(因为我发现编译器很可能在基于范围的情况下执行一些优化)

请注意,我要求深入了解可能的编译器行为,而不是 C++ 标准。

4

1 回答 1

2

取决于你在循环内做什么。

如果你只看一次“它”,应该没有区别,因为编译器无论如何都必须先查找地址,然后取消引用它以获得值。

如果您多次查看“it”,由于内存一致性问题,它可能会有所不同——如果您写入可能与“it”别名的东西,它将不得不一次又一次地重新加载该值。

但与往常一样,使用分析器只解决那些真正存在的性能问题。

于 2012-12-08T09:40:33.270 回答