有人告诉我我可以写
for (iterator it = somecontainer.begin(); it != somecontainer.end(); ++it)
代替
for (iterator it = somecontainer.begin(); it != somecontainer.end(); it++)
...因为后者要付出额外的未使用临时变量的代价。此优化对现代编译器有用吗?编写代码时是否需要考虑这种优化?
最佳答案
这是一个好习惯,因为迭代器可能是任意复杂的。对于vector::iterator
或int
索引,不,不会有任何区别。
编译器永远无法消除(删除)副本,因为省略副本只会消除中间临时对象,而不会消除未使用的临时对象。对于包括大多数迭代器的轻量级对象,编译器可以优化实现副本的代码。但是,有时不总是很明显。例如,保证后递增的istream_iterator<string>
可以复制最后读取的string
对象。在非引用计数的string
实现中,它将分配,复制并立即释放内存。该问题甚至更可能适用于支持后期增量的较重的非迭代器类。
当然没有缺点。在过去的一两年中,它似乎已成为主流风格。
关于c++ - 将i++优化为++ i以避免临时变量是否有意义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3724589/