我最近开始使用基于范围的(在获得编译器功能之后)。我注意到,使用基于范围的首选形式是:
for(const auto& it: container) {...}
这对于大于int的任何类型都有意义。但是,如果容器保存原始指针(在我的情况下)或较小的类型怎么办?
具体来说,我想知道的是:
1)是否可以通过请求引用而不是(可能是)较小的副本来造成性能损失?如果类型的大小与本机指针的大小完全相等怎么办?
2)相反,是否可能由于不使用引用而导致性能下降? (因为我发现在基于范围的情况下编译器可能会执行一些优化)
请注意,我要求了解可能的编译器行为,而不是C++标准。
最佳答案
取决于您在循环中执行的操作。
如果只看一次“it”,那应该没有什么区别,因为编译器还是必须先寻找地址,然后再对其进行引用以获取值。
如果您多次查看“it”,则由于内存一致性问题可能会有所不同-如果您写一些可能带有“it”别名的内容,则必须一次又一次重新加载该值。
但是和往常一样,使用探查器仅解决那些真正存在的性能问题。
关于c++ - 在基于范围的for循环中,对于小型类型,引用比拷贝更有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13774761/