[解決済み】C++11の「auto」を使用すると、パフォーマンスが向上する?
質問
の理由はわかりますが
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_type
は
std::pair<const Key, Val>
でなく
std::pair<Key, Val>
. したがって、(暗黙のうちに)持っているとき。
std::pair<Key, Val> const& item = *iter;
既存のオブジェクトへの参照を取ってそのままにするのではなく、型変換をする必要があります。暗黙の変換が可能である限り、異なる型のオブジェクト(または一時的なもの)への const 参照を取ることは許されています、例えば。
int const& i = 2.0; // perfectly OK
型変換は暗黙のうちに許される変換です。
const Key
を
Key
しかし、それを可能にするために、新しい型のテンポラリーを構築しなければならない。したがって、このループは効果的に
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
}
参照される型はイニシャライザの型と一致するので、一時参照や変換は必要なく、直接参照すればいいのです。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)