1. ホーム
  2. c++

[解決済み】C++11の「auto」を使用すると、パフォーマンスが向上する?

2022-04-04 02:31:41

質問

の理由はわかりますが auto の型は、正しさと保守性を向上させます。また、パフォーマンスも向上させることができると書いてありました( ほぼ常に自動 by Herb Sutter)がありますが、良い解説がないのが残念です。

  • どのようにして auto パフォーマンスを向上させることができますか?
  • どなたか例を挙げてください。

どのように解決するのですか?

auto は、次のような方法でパフォーマンスを向上させることができます。 無言の暗黙の変換を避ける . 私が説得力を感じた例は、次のようなものです。

std::map<Key, Val> m;
// ...

for (std::pair<Key, Val> const& item : m) {
    // do stuff
}

バグがあるでしょ?ここでは、マップのすべてのアイテムをconst参照でエレガントに取得し、新しいrange-for式を使って意図を明確にしているつもりですが、実際には、以下のようにコピーしています。 すべての 要素で構成されています。これは std::map<Key, Val>::value_typestd::pair<const Key, Val> でなく std::pair<Key, Val> . したがって、(暗黙のうちに)持っているとき。

std::pair<Key, Val> const& item = *iter;

既存のオブジェクトへの参照を取ってそのままにするのではなく、型変換をする必要があります。暗黙の変換が可能である限り、異なる型のオブジェクト(または一時的なもの)への const 参照を取ることは許されています、例えば。

int const& i = 2.0; // perfectly OK

型変換は暗黙のうちに許される変換です。 const KeyKey しかし、それを可能にするために、新しい型のテンポラリーを構築しなければならない。したがって、このループは効果的に

std::pair<Key, Val> __tmp = *iter;       // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it

(もちろん、実際には __tmp オブジェクトにバインドされているだけです。 item を使用します)。

に変えただけ。

for (auto const& item : m) {
    // do stuff
}

参照される型はイニシャライザの型と一致するので、一時参照や変換は必要なく、直接参照すればいいのです。