2013-10-27 8 views
21
auto a = 10; 

aintの場合、コンパイル時または実行時です。実行時に型を推定すると、パフォーマンスに影響しませんか?C++ 11自動コンパイル時またはランタイム?

おかげ

+3

ランタイムパフォーマンスにはまったく影響しません –

+13

'c'と' C++ 'は静的ですすべての型はコンパイル時に知っていなければなりません。 'auto'は' C++ 'の一部であるため、実行時の型チェックを必要としません。 – Rubens

+4

@Rubens RTTIを扱わない限り@Rubens – vines

答えて

40
int i = 2; 

コンパイル時間と同じコンパイル。 C++では、実行時の型情報はコンパイル時に削除されます(RTTIまたは仮想継承なし)。実際、実行時にプリミティブ型を検査することはできません。

8

それは無いパフォーマンスの違いで、コンパイル時に完全に行われています。

auto i = 2; 

+4

です。他の例では、パフォーマンスの違いがあるかもしれません。 autoは決して型変換を行わないことが保証されているので、少なくとも高速であれば常にそれが高速です。 –

14

他の回答では触れていないことを追加したかっただけです。

  1. すべての宣言はコンパイル時に既知の型でなければならないので、autoは特別な扱いを受けません。コンパイル時に型を推測する必要があります。
  2. あなたはどのようにautoを使用すべきかを誤って解釈しています。はい、あなたはauto i = 2;を行うことができ、うまく動作します。しかし、あなたが自動車を必要とする状況は、例えばラムダです。ラムダには名前付きの型はありません(ただし、std::functionに割り当てることができます)。クラスや関数テンプレートの内部では、ある種の操作の種類を特定するのが非常に難しい場合があります(たぶん不可能かもしれません)。たとえば、関数がテンプレートの型で呼び出されたときに、与えられた型では、複数の型では、どの型を返すかを理解することは本質的に不可能になります。もちろん、decltypeに関数をラップして戻り値を計算することもできますが、autoは書くのがはるかにクリーンです。
  3. 人々はまた彼らのタイプが書くためにかなりの痛みをされているので、イテレータのために自動にかなりのビットを使用しているようだが、私は、これは変数の型を宣言auto
+3

:+1、私はあなたの最初と2番目のポイントが好きですが、反復子を使用している間に書かなければならない3つのコードは不器用なので、挑戦的にコードを読みやすくします。 –

+0

@pranitkothari私はあなたがそれをしてはいけないと言っていませんでした。私はそれがずっと前にイテレーターを使用していた理由は、 '自動'が追加された理由ではないと言っているだけです – aaronman

+0

あなたは正しいです。 –

5

の意図主な用途であるので、わからないんだけど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の意図された使用は、開発者の作業をより簡単にするためです。

+0

+1リンクありがとうございます。 –

+1

説明していない第3の状況があります。タイプが変更されたが、コードに変更がない場合です。これはコンテナの関数を開発するときによく起こります。なぜなら、それらは頻繁に似ているか同一のインターフェースを持っているからです。コードがほとんど変更されないので、型を変更するとコードは自動的に変更に適応します。自動車はそのような状況での開発に本当に役立ちます。 – Fred

+0

私はHerb SutterがC++でのプログラミングに関して "彼が何をしているかを知っている"と確信しています。コンパイラは 'auto'を使うたびに正しい型を推論すると確信しています。しかし、私は、コンパイラが推論するものと、それが私の期待と完全に一致するかどうかを常に知っているとは確信していません。したがって、私ができるときはいつでも、 'auto'の使用を防ぎます。 (私はソースコードの明白さが現代的で改良された時代を覚えています)。 – Scheff

関連する問題