2017-04-11 13 views
3

最近、私はここの範囲-V3からのコメントをコミット読んだ:、コミットメッセージが言う https://github.com/ericniebler/range-v3/commit/a4829172c0d6c43687ba213c54f430202efd7497static_cast <T&&>(t)std :: forwardよりも高速です<T>(t)をコンパイルするには?

はわずかSTDを置き換えることにより、コンパイル時間を改善:: はstatic_cast

に転送します

私は、std::forward<T>(t)が標準でstatic_cast<T&&>(t)を返すことを知っています。 また、T &&tが参照崩壊規則によって普遍的なreferece(または転送参照)である場合、時々static_cast<T&&>(t)がうまく動作することがわかります。

コミットメッセージには、static_castがわずかに向上したパフォーマンスを向上させるというメッセージがあります。 std::forward<T>(t)がちょうどstatic_cast<T&&>(t)を返す場合、コンパイルのパフォーマンスにはどのような違いがありますか?

多分std::forward<T>(t)は何とか控除を必要としますか?または、std::forward<T>(t)はコンパイラを抑制するいくつかの魔法のことをしますか?

答えて

2

あなたがstd::forward<T>(t)行うたびに、コンパイラは、テンプレートstd::forwardを(あるいは少なくとも、それはその前にTとそれをインスタンス化しているかどうかを確認)インスタンス化する必要があります。このテンプレートではコードはあまり生成されませんが、それでもテンプレートインスタンス化の作業は必要です。

ほとんどのコードでは、これは基本的にコンパイル時の丸め誤差です。しかし、Ranges TSにとって、彼らがそこで行うことのすべてを転送すると、(それでもやはり「限界的」であるにしても)自明ではない可能性があります。

関連する問題