プリミティブを宣言するとき、代入演算子またはコピーコンストラクタを使用すると問題はありますか? どちらが最適なパフォーマンスを発揮するのでしょうか?あるいは、今日のほとんどのコンパイラは、この2つのステートメントを同じマシンコードにコンパイルしますか?あなたは、静的な初期化を行う場合、私は彼らが同じであることをかなり確信しているプリミティブ型を初期化すると効率的ですか?
int i = 1;
int j(1);
プリミティブを宣言するとき、代入演算子またはコピーコンストラクタを使用すると問題はありますか? どちらが最適なパフォーマンスを発揮するのでしょうか?あるいは、今日のほとんどのコンパイラは、この2つのステートメントを同じマシンコードにコンパイルしますか?あなたは、静的な初期化を行う場合、私は彼らが同じであることをかなり確信しているプリミティブ型を初期化すると効率的ですか?
int i = 1;
int j(1);
同じのために:
int i = 1;
int j(1);
のためではない:
Cat d;
Cat c1;
c1 = d;
Cat c2(d);//<-- more efficient
は、しかし、実行時に何の初期化はありません、値がバイナリに組み込まれています。
キーワードstaticの意味では必ずしも適切ではありませんが、
パフォーマンスが事実上同じであれば、私は代入演算子を使うことをお勧めします。あなたがしていることがはっきりしています。 – Mark
より明確なものは相対的なものですが、文法のようなコンストラクタがより多く見えるほど明確であると主張する人もいます。 (私は割り当てを好む)。 –
私は両方が同じにコンパイルされますと思います。あなたとあなたのコードを読める他の人のために最も読みやすいと感じるものを使用してください。
一般的に、この質問には答えられません。プリミティブ型の場合、良いコンパイラはそれらを同じアセンブリ命令に減らしますが、ユーザ定義型(つまり、クラス)では、コピーと代入演算子を書いた人の慈悲を受けます。コピーコンストラクタを書いた人が、代入演算子を書いた人と同じではなかったため、あるものが他のものよりも速いコードを見たことがあります。それらのうちではなかった。
質問は特にプリミティブ型についてです。 –
単一のプリミティブ型の場合、それは重要ではありません。
重要なことは、プリミティブ型の集約がある場合です。つまり、PODです。その場合には、集計初期化子構文を使用していること、それをインスタンス化するための効率的な方法は、もうありません。
struct POD
{
int n;
double d;
bool b;
};
それはあなたのPODだ場合は、この:
POD pod = {1, 3.14, true};
が...することはできません効率の面で拍車をかける。
なぜより効率的ですか?デフォルトのコンストラクタは最初にc1のために呼び出されますか? –
これらは同じタイプです。ここでは関係ありません。 Cat c1 = d;およびCat2(d)。同じことをするつもりです。彼らはタイプが異なり、派生していない場合は重要です。ケースはCat c1を行います((Cat(d)))。 (d)ケースはC c2(d)を行っている。 (まあ驚き!:)) –
本当ですか? "Cat c1 = d;"の違いは何ですか?と "Cat c2(d);"私は、同じコピーコンストラクタを呼び出すと思っていました(最初のものは割り当てのように見えますが、それはコピーです)。 – ChrisW