2012-05-26 9 views
5

私が理解している限りでは、パフォーマンスが向上しないため、単純な型はC++での参照で渡すべきではありません。少なくとも私がネットから集めることができたものだ。単純な型を参照渡ししない理由は?

理由がわかりませんなぜパフォーマンスが悪いのですか?C++は変数よりも新しい単純な型を作成する方が速いからですか?

+1

参照パラメータは呼び出し時のセマンティクスを変更します。... –

+0

定数参照を渡すとコンパイラの最適化が期待されます(コンパイラはこれを値渡しに変換します)。 –

答えて

6

あなたが参照を作成した場合、それはです:

pointer to memory location -> memory location 

あなたが値を使用している場合、それはです:

memory location 

値がいずれかの方法(参照または値)にコピーする必要がありますので、参照渡しでもパフォーマンスは向上しません。 1つの特別な検索が行われなければならない。だから、理論的にはパフォーマンスを "悪化させる"が、あなたが気づくほどの量ではない。

+0

これは誤解を招くような回答です。 _ "値はどちらの方法でもコピーする必要があるため" _。 refを渡しても値がコピーされることはなく、同じオブジェクトに対してポインタ操作が使用されます。したがって、 'double'を渡すと、' double'のコピーを作成し(それが左辺値である場合)、関数内でそのコピーを使用することを意味します。参照を渡すと、関数にポインタを渡し、値が使用されているときはいつでも参照解除を実行しますが、varをスタックに置かないことを意味します。値argを持つ別のものを呼び出すref引数を持つ関数がある場合、2番目の関数だけがスタックにvarを割り当てます。 –

+0

@AdamHunyadi:参照渡しによってポインタがコピーされます(最適化まで)。それは私が「価値」を意味するものです。 (あなたが引用した部分の後ろの括弧内の部分を読むことによって、それを知ることができます)。 – Ryan

0

内部参照は、ポインタで処理されます。ポインタは、アクセスするたびに逆参照する必要があります。明らかに追加の操作が必要です。

+0

参照はポインタではありません。また、参考文献をポインタと考えるべきでもありません。 –

+0

ローカルのスコープで作成された参照については同意できますが、参照としてメソッドにメソッドを渡すのはどうですか?値渡し(読み込み:スタックにコピーを置く)でない場合は、参照先オブジェクトへのポインタを渡す唯一の選択肢です。スタックやレジスタを介して何かを渡す必要があります。そのため、値全体またはポインタを指定する必要があります。また、参照は明らかに値全体ではないので、ポインタでなければなりません。私はC#とJavaの "単純に動作する"方法でそれらを考えるのが好きですが、内部的にはそれらは自動逆参照ポインターのように動作します。 – Wormbo

+0

言語構造(ポインタ/参照)を実装の詳細にマッピングしています。これはあまり有用ではありません。 –

0

たとえば、32ビットモードでは、intのサイズは4バイトで、int *のポインタサイズは4バイトです。 4バイトのintを直接渡す方が、4バイトのポインターを渡してからintをそのポインターでロードするよりも速くなります。

+0

@Loki Astari:いくつかの設定のパラメータは常にメモリからロードされます(ポインタまたは値である必要があります)。ポインタの場合、メモリから別のロードがあります。これは、値自体がパラメータとして渡される場合ではありません。 – Ruben

2

あなたにはあなたのコードに注意を払っていることがわかります。しかし、良いニュースは、この特定のケースでは、簡単な方法があるということです。

デイブAbrahmsによるこの優れた記事では、すべてのご質問にお答えして、いくつか:Want Speed? Pass by Value.

を正直なところ、それはそれを要約するリンク正義をしない、それは本当の必読です。しかし、短いストーリーを作るためには、コンパイラはそれを正しく実行するのに十分なほどスマートです。手動で行うと、コンパイラが特定の最適化を行わない可能性があります。

関連する問題