考虑这个例子:
#include <utility>
// runtime dominated by argument passing
template <class T>
void foo(T t) {}
int main() {
int i(0);
foo<int>(i); // fast -- int is scalar type
foo<int&>(i); // slow -- lvalue reference overhead
foo<int&&>(std::move(i)); // ???
}
是否foo<int&&>(i)
一样快foo<int>(i)
,或者它是否涉及指针开销foo<int&>(i)
?
编辑:正如建议的那样,运行g++ -S
给了我相同的 51 行汇编文件foo<int>(i)
和foo<int&>(i)
,但foo<int&&>(std::move(i))
产生了 71 行汇编代码(看起来差异来自std::move
)。
编辑:感谢那些推荐g++ -S
不同优化级别的人——使用-O3
(和制作 foo noinline
)我能够获得看起来像xaxxon 解决方案的输出输出。