答えて
int i = 2;
コンパイル時間と同じコンパイル。 C++では、実行時の型情報はコンパイル時に削除されます(RTTIまたは仮想継承なし)。実際、実行時にプリミティブ型を検査することはできません。
それは無いパフォーマンスの違いで、コンパイル時に完全に行われています。
auto i = 2;
は
です。他の例では、パフォーマンスの違いがあるかもしれません。 autoは決して型変換を行わないことが保証されているので、少なくとも高速であれば常にそれが高速です。 –
他の回答では触れていないことを追加したかっただけです。
- すべての宣言はコンパイル時に既知の型でなければならないので、
auto
は特別な扱いを受けません。コンパイル時に型を推測する必要があります。 - あなたはどのように
auto
を使用すべきかを誤って解釈しています。はい、あなたはauto i = 2;
を行うことができ、うまく動作します。しかし、あなたが自動車を必要とする状況は、例えばラムダです。ラムダには名前付きの型はありません(ただし、std::function
に割り当てることができます)。クラスや関数テンプレートの内部では、ある種の操作の種類を特定するのが非常に難しい場合があります(たぶん不可能かもしれません)。たとえば、関数がテンプレートの型で呼び出されたときに、与えられた型では、複数の型では、どの型を返すかを理解することは本質的に不可能になります。もちろん、decltype
に関数をラップして戻り値を計算することもできますが、auto
は書くのがはるかにクリーンです。 - 人々はまた彼らのタイプが書くためにかなりの痛みをされているので、イテレータのために自動にかなりのビットを使用しているようだが、私は、これは変数の型を宣言
auto
:+1、私はあなたの最初と2番目のポイントが好きですが、反復子を使用している間に書かなければならない3つのコードは不器用なので、挑戦的にコードを読みやすくします。 –
@pranitkothari私はあなたがそれをしてはいけないと言っていませんでした。私はそれがずっと前にイテレーターを使用していた理由は、 '自動'が追加された理由ではないと言っているだけです – aaronman
あなたは正しいです。 –
の意図主な用途であるので、わからないんだけどauto
を使用すると、次のコードスニペットがある場合を意味し、コンパイル時に行われます。
auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3
ハーブサッター(現在はC++標準化委員会の担当の男を)可能な限り「autoを使用することをお勧めしますそれは便利です2つの理由からです:まず、最も明白なのは、便利なt帽子はすでに述べた型名とコンパイラがすでに知っている型名を繰り返さないようにします。第二に、タイプが不明瞭な、または簡単な名前のついたタイプ(例えば、ラムダ関数のタイプなど)があり、他の方法で簡単にまたは完全に綴ることができない場合の単なる利便性だけではありません」(thisブログ参照)。 auto
の意図された使用は、開発者の作業をより簡単にするためです。
+1リンクありがとうございます。 –
説明していない第3の状況があります。タイプが変更されたが、コードに変更がない場合です。これはコンテナの関数を開発するときによく起こります。なぜなら、それらは頻繁に似ているか同一のインターフェースを持っているからです。コードがほとんど変更されないので、型を変更するとコードは自動的に変更に適応します。自動車はそのような状況での開発に本当に役立ちます。 – Fred
私はHerb SutterがC++でのプログラミングに関して "彼が何をしているかを知っている"と確信しています。コンパイラは 'auto'を使うたびに正しい型を推論すると確信しています。しかし、私は、コンパイラが推論するものと、それが私の期待と完全に一致するかどうかを常に知っているとは確信していません。したがって、私ができるときはいつでも、 'auto'の使用を防ぎます。 (私はソースコードの明白さが現代的で改良された時代を覚えています)。 – Scheff
- 1. MongoDB C++ 11のコンパイル時にエラーが発生しました
- 2. C++ 11でコンパイル時や実行時に自動的に型を推定しますか?
- 3. C++用の自動ツールチェック11
- 4. Genericsランタイムまたはコンパイル時の多型はありますか?
- 5. std :: coutはコンパイル時に相当する、またはstatic_assert C++でのコンパイル時定数値の文字列化11
- 6. java注釈 - ランタイム時の自動使用
- 7. コンパイル時/ランタイムの追加
- 8. 自動コンパイルMS Visual C++
- 9. C++なしでコンパイル時アサーションを作成するには11
- 10. vimとC++ 11ラムダ:自動インデント
- 11. 自動でC++ 11の初期化
- 12. 自動インポート - Pythonランタイム
- 13. シリアライゼーションチェック - 時間とランタイムをコンパイルする
- 14. C++ 11でコンパイル/リンクされたサードパーティのスレッドライブラリには、C++ 11スレッドセーフの保証が適用されますか?
- 15. C++ 11の自動ループ&ループが動作しない
- 16. コンパイル時の自動化された単体テストテスト
- 17. g ++でC++ 11をコンパイルする
- 18. C++ 11をコンパイルする方法
- 19. QtGStreamerはC++ 11標準によるヘッダーのコンパイル時エラーですか?
- 20. 自動実行スクリプトはJavaランタイムで実行されません
- 21. iOS 11 UIToolBar自動拡張
- 22. ウィジェットでランタイム/コンパイル時間をチェックしていますか?
- 23. 次のコードは `C++ 03`でコンパイルされますが、` C++ 11`ではコンパイルされません
- 24. コンパイル時の変換は、C#
- 25. Cプログラム:長さはコンパイル時
- 26. C++ 11の範囲ベースのforループ効率 "のconstオート&i" が "自動I" C++ 11では
- 27. Silverlightランタイム質問のコンパイル
- 28. ビットコード自動再コンパイル
- 29. C++ 11リスト間の要素の移動(または他のコンテナ)
- 30. C++コンパイル時bignumライブラリ
ランタイムパフォーマンスにはまったく影響しません –
'c'と' C++ 'は静的ですすべての型はコンパイル時に知っていなければなりません。 'auto'は' C++ 'の一部であるため、実行時の型チェックを必要としません。 – Rubens
@Rubens RTTIを扱わない限り@Rubens – vines