static_cast<T&&>(t) 编译速度比 std::forward<T>(t) 快?
static_cast<T&&>(t) faster than std::forward<T>(t) for compilation?
最近,我在这里阅读了 range-v3 的提交评论:
https://github.com/ericniebler/range-v3/commit/a4829172c0d6c43687ba213c54f430202efd7497
提交消息说,
marginally improve compile times by replacing std::forward with
static_cast
我知道 std::forward<T>(t)
returns static_cast<T&&>(t)
,按标准。
我也知道有时 static_cast<T&&>(t)
当 T &&t
通过引用折叠规则是通用引用(或转发引用)时可以正常工作。
我感兴趣的是提交消息说 static_cast
稍微提高了编译性能。如果 std::forward<T>(t)
只是 returns static_cast<T&&>(t)
,是什么导致编译性能如此不同?
也许 std::forward<T>(t)
无论如何都需要某种扣除?或者,std::forward<T>(t)
是否做了一些神奇的事情来限制编译器?
每次执行 std::forward<T>(t)
时,编译器都必须实例化几个模板:std::forward
本身有两个重载,以及作为函数签名一部分的 remove_reference
。虽然这些模板不会生成太多代码,但它仍然需要完成模板实例化的工作。
对于大多数代码,这实际上是编译时的舍入错误。但是对于 Ranges TS,由于他们在那里所做的所有转发,这可能是非常重要的(尽管仍然是“边际”)。
最近,我在这里阅读了 range-v3 的提交评论: https://github.com/ericniebler/range-v3/commit/a4829172c0d6c43687ba213c54f430202efd7497
提交消息说,
marginally improve compile times by replacing std::forward with static_cast
我知道 std::forward<T>(t)
returns static_cast<T&&>(t)
,按标准。
我也知道有时 static_cast<T&&>(t)
当 T &&t
通过引用折叠规则是通用引用(或转发引用)时可以正常工作。
我感兴趣的是提交消息说 static_cast
稍微提高了编译性能。如果 std::forward<T>(t)
只是 returns static_cast<T&&>(t)
,是什么导致编译性能如此不同?
也许 std::forward<T>(t)
无论如何都需要某种扣除?或者,std::forward<T>(t)
是否做了一些神奇的事情来限制编译器?
每次执行 std::forward<T>(t)
时,编译器都必须实例化几个模板:std::forward
本身有两个重载,以及作为函数签名一部分的 remove_reference
。虽然这些模板不会生成太多代码,但它仍然需要完成模板实例化的工作。
对于大多数代码,这实际上是编译时的舍入错误。但是对于 Ranges TS,由于他们在那里所做的所有转发,这可能是非常重要的(尽管仍然是“边际”)。