有人告诉我我可以写

for (iterator it = somecontainer.begin(); it != somecontainer.end(); ++it)

代替
for (iterator it = somecontainer.begin(); it != somecontainer.end(); it++)

...因为后者要付出额外的未使用临时变量的代价。此优化对现代编译器有用吗?编写代码时是否需要考虑这种优化?

最佳答案

这是一个好习惯,因为迭代器可能是任意复杂的。对于vector::iteratorint索引,不,不会有任何区别。

编译器永远无法消除(删除)副本,因为省略副本只会消除中间临时对象,而不会消除未使用的临时对象。对于包括大多数迭代器的轻量级对象,编译器可以优化实现副本的代码。但是,有时不总是很明显。例如,保证后递增的istream_iterator<string>可以复制最后读取的string对象。在非引用计数的string实现中,它将分配,复制并立即释放内存。该问题甚至更可能适用于支持后期增量的较重的非迭代器类。

当然没有缺点。在过去的一两年中,它似乎已成为主流风格。

关于c++ - 将i++优化为++ i以避免临时变量是否有意义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3724589/

10-15 16:19