首页 > 解决方案 > 是否值得将函数调用的结果存储在临时变量中以便在这种情况下进一步重用?

问题描述

std::rotate(vec.begin(), vec.begin() + index, vec.begin() + index + 1);
auto first = vec.begin();
auto toMove = first + index;
std::rotate(first, toMove, toMove + 1);

第二个版本会比第一个更有效吗?编译器是否可以隐式优化第一个版本以避免多次调用vec.begin()

标签: c++performanceoptimization

解决方案


唯一可能的答案是“视情况而定”。什么?关于所涉及的迭代器的实现。

例如,std::vector对于两个选项,我得到了完全相同的生成机器代码。这是因为向量迭代器基本上只是指向向量值类型的指针,可能包装在某个实现类中。然后,编译器很容易解决具有这种“基本”类型的操作的优化问题。

现场演示:https ://godbolt.org/z/srxcrbaqf

相反,使用std::deque,我得到了两个选项的不同机器代码。而且,第二个似乎更有效。至少,它更短,有 89 条装配线,而 115 条。原因是双端队列不会在内存中连续存储元素,因此它的迭代器需要以更复杂的面向对象方式实现。而且,这在实践中可能会阻碍优化。

现场演示:https ://godbolt.org/z/1oqjzMerv

顺便说一句,在我对 libstdc++ 的实验中,向量迭代器甚至是一种可简单复制的类型,而双端队列迭代器则不是:https ://godbolt.org/z/GfqhaaaYM 。


推荐阅读