考虑以下例子:
#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)); // ???
}
< p > 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's solution 的输出。
g++ -S
命令,我得到了相同的 51 行汇编代码 - 尝试不同的优化级别(-O1
vs--O2
vs-O3
vs-Os
)。 - Jesper Juhl-S
在没有-Os
的情况下几乎从不有实际意义,特别是在-O0
或者-O3
的情况下更不会有。只有-S -Os
才能产生近似可读的汇编代码,并且显示出实际发生了什么。即便如此,您的模板foo<>
实际上甚至没有尝试使用其参数。优化器将会忽略您尝试查看的内容。为了进行适当的分析,请在单独的文件中定义三个非模板函数,例如int foo_noref(int arg) { return arg; }
并使用-S -Os
进行编译。然后对调用void bar_noref() { int i = 0; foo_noref(i); }
进行相同操作。 - cmaster - reinstate monica