【发布时间】:2019-03-08 04:25:25
【问题描述】:
在 C++ 标准库中,有很多单行函数模板。例如。 std::move 本质上只是一个转换,一个实现可能是:
template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
我知道实际上,不会从 std::move 生成任何机器代码,因为它只是一个演员表。我的问题是:标准中是否有任何保证说,对于像 std::move 或 std::forward 之类的函数(只不过是强制转换),它们必须总是被内联(所以不生成机器代码)?换句话说,(迂腐的)编译器是否可以将它们视为普通函数(即,将参数放在堆栈上,并生成 call 和 ret 指令) ?
【问题讨论】:
-
该标准没有指定没有可观察到的副作用的优化。如果您询问的是启用了优化的体面的编译器,那么这将不会生成函数调用。
-
为什么重要。只要程序按预期进行。
-
该标准不承诺
int i = 0; i++;不会花费 5 分钟和 117 次机器级函数调用。您依靠编译器来合理地行事。
标签: c++