私が理解している限りでは、パフォーマンスが向上しないため、単純な型はC++での参照で渡すべきではありません。少なくとも私がネットから集めることができたものだ。単純な型を参照渡ししない理由は?
理由がわかりませんなぜパフォーマンスが悪いのですか?C++は変数よりも新しい単純な型を作成する方が速いからですか?
私が理解している限りでは、パフォーマンスが向上しないため、単純な型はC++での参照で渡すべきではありません。少なくとも私がネットから集めることができたものだ。単純な型を参照渡ししない理由は?
理由がわかりませんなぜパフォーマンスが悪いのですか?C++は変数よりも新しい単純な型を作成する方が速いからですか?
あなたが参照を作成した場合、それはです:
pointer to memory location -> memory location
あなたが値を使用している場合、それはです:
memory location
値がいずれかの方法(参照または値)にコピーする必要がありますので、参照渡しでもパフォーマンスは向上しません。 1つの特別な検索が行われなければならない。だから、理論的にはパフォーマンスを "悪化させる"が、あなたが気づくほどの量ではない。
これは誤解を招くような回答です。 _ "値はどちらの方法でもコピーする必要があるため" _。 refを渡しても値がコピーされることはなく、同じオブジェクトに対してポインタ操作が使用されます。したがって、 'double'を渡すと、' double'のコピーを作成し(それが左辺値である場合)、関数内でそのコピーを使用することを意味します。参照を渡すと、関数にポインタを渡し、値が使用されているときはいつでも参照解除を実行しますが、varをスタックに置かないことを意味します。値argを持つ別のものを呼び出すref引数を持つ関数がある場合、2番目の関数だけがスタックにvarを割り当てます。 –
@AdamHunyadi:参照渡しによってポインタがコピーされます(最適化まで)。それは私が「価値」を意味するものです。 (あなたが引用した部分の後ろの括弧内の部分を読むことによって、それを知ることができます)。 – Ryan
内部参照は、ポインタで処理されます。ポインタは、アクセスするたびに逆参照する必要があります。明らかに追加の操作が必要です。
参照はポインタではありません。また、参考文献をポインタと考えるべきでもありません。 –
ローカルのスコープで作成された参照については同意できますが、参照としてメソッドにメソッドを渡すのはどうですか?値渡し(読み込み:スタックにコピーを置く)でない場合は、参照先オブジェクトへのポインタを渡す唯一の選択肢です。スタックやレジスタを介して何かを渡す必要があります。そのため、値全体またはポインタを指定する必要があります。また、参照は明らかに値全体ではないので、ポインタでなければなりません。私はC#とJavaの "単純に動作する"方法でそれらを考えるのが好きですが、内部的にはそれらは自動逆参照ポインターのように動作します。 – Wormbo
言語構造(ポインタ/参照)を実装の詳細にマッピングしています。これはあまり有用ではありません。 –
たとえば、32ビットモードでは、int
のサイズは4バイトで、int *
のポインタサイズは4バイトです。 4バイトのint
を直接渡す方が、4バイトのポインターを渡してからint
をそのポインターでロードするよりも速くなります。
@Loki Astari:いくつかの設定のパラメータは常にメモリからロードされます(ポインタまたは値である必要があります)。ポインタの場合、メモリから別のロードがあります。これは、値自体がパラメータとして渡される場合ではありません。 – Ruben
あなたにはあなたのコードに注意を払っていることがわかります。しかし、良いニュースは、この特定のケースでは、簡単な方法があるということです。
デイブAbrahmsによるこの優れた記事では、すべてのご質問にお答えして、いくつか:Want Speed? Pass by Value.
を正直なところ、それはそれを要約するリンク正義をしない、それは本当の必読です。しかし、短いストーリーを作るためには、コンパイラはそれを正しく実行するのに十分なほどスマートです。手動で行うと、コンパイラが特定の最適化を行わない可能性があります。
参照パラメータは呼び出し時のセマンティクスを変更します。... –
定数参照を渡すとコンパイラの最適化が期待されます(コンパイラはこれを値渡しに変換します)。 –