効率を高め、サイズを減らすために参照変数だけを使用する人はいますか?

あなたの何人かがすでに気付いていないなら、私は騒ぎです。それは私の質問です。

経験豊富なプログラマーの皆さんが参照変数を使用してプログラムに必要なメモリを減らしていますか?おそらく危険な習慣ではあるが、モバイルアプリケーションの参照変数を使用してメモリを少なくして高速化できると思っていた。

I know that in C++ when you pass a variable, as an argument, to a function that it creates a copy of that variable, but you can use the & to make it a reference variable which just points to the variables memory location. Wouldn't that make your program use less memory overall and make things faster?

1
char(size == 1)とchar(size == 4または8)の参照の違いは何ですか?
追加された 著者 Paul R,
あなたの最初の前提は間違っています - あなたは、参照を使用してメモリ使用量を減らすことをお勧めしますが、値でcharを渡すには1バイトが必要ですが、参照によってcharを渡すにはアドレス(通常4または8バイト)値を取得する。
追加された 著者 Paul R,
これはアーキテクチャおよびABIに依存しますが、通常は値がレジスタおよび/またはスタックに渡されます。
追加された 著者 Paul R,
私はこれを理解しているか分からない。
追加された 著者 JeramyRR,
私はそれが説明されている今、その部分を得るが、すべてがちょうど渡されます。変数を参照として渡すことなく、プログラムはメモリ内に新しい変数を作成する必要があります。アドレスの受け渡しは、メモリ内に全く新しい変数を作成し、そのアドレスを覚えておくよりも、より多くのメモリと処理を必要としますか?
追加された 著者 JeramyRR,

3 答え

  1. 構造物やオブジェクトのような大きなものについては、リファレンスはメモリを少なくします。しかし、ほとんどの人はすでにリファレンスを渡していますので、議論の対象とはなりません。

  2. intやcharなどのより小さなものは、参照と同じサイズかそれ以下です。参照によってそれらを渡すことによってメモリ利得はありません...

  3. ...しかし、値を操作するために参照を逆参照する必要があるため、パフォーマンス上のペナルティがあります。

  4. 最後に、参照渡しは、値渡しのバグが発生しやすくなります。プログラムは正確さのためにまず構築され、パフォーマンスは2番目に構築されるべきです。

2
追加された
すばらしいです。私は間違いなく以下のすべてのものを書いたはずです。
追加された 著者 iehrlich,
ありがとうございました。逆参照のためのペナルティがあることはわかりませんでした。私はC ++がバックグラウンドでそれを行うので、私はそれがステップであったことさえ気づかなかったと思います。
追加された 著者 JeramyRR,

これは、(a)基本アーキテクチャ、(b)フレームワーク、(c)言語に依存しますが、一般的な答えはいいえです。 >はい - あなたのアプローチを使用すると、プログラムの実行が遅くなる(遅くなることがあります)。

1
追加された
参照を使用する場合、なぜプログラムが「はるかに遅く」実行されるのかを正確に説明してください。
追加された 著者 Paul R,
@ PaulR:私が言ったように、それは真剣にいくつかのものに依存します。 CやC ++のようなものを使って、CLRやJVMのようなものがないx86アーキテクチャを考えてみましょう。プロシージャがあり、wchar_tにsizeof(wchar_t)= 1バイトを渡す必要があります。スタックに値を置く場合は、1バイトを書き、1バイトだけ読み込む必要があります。スタックへの参照をスタックに置く場合、4バイト(sizeof(MAddr)= 4を考慮)を書き、4バイトを読み取り、これらの4バイトで指定されたアドレスから間接読み取りを実行する必要があります。
追加された 著者 iehrlich,
次の例。クラスのメンバクラスインスタンスをコンテナにリンクさせるか、インスタンス化することをお勧めしますか?インスタンス化する場合は、 "ClassName objactName"を実行しコンテナコンストラクタにコンストラクタを指定します。そうでない場合は "ClassName * objectRef"を実行し、 "new ClassName(...)"を使用します。コンパイル時にメンバーのメンバーのオフセットを生成することができるため(たとえば、アクセサのインライン展開を実行する場合など)、最初のオプションはコンパイラにとってより優れています。
追加された 著者 iehrlich,
彼らがなぜより遅く動くのか説明できますか?新しい変数を作成するステップをスキップしている場合、それを速くするのではないでしょうか?
追加された 著者 JeramyRR,

Cの変数はデフォルトでは値によって渡され、値を渡している間は参照渡しのほとんどの利点がありません(参照する値ではなくポインタです)。バイトへのポインタはバイトよりも大きくなることに注意してください!

配列や構造体などのより複雑な型では、Cはデフォルトで参照によってそれらを渡します。構造体のコピーを何らかの理由で必要としない限り、関数に渡す構造体のコピーを作成することは非効率的です。 参照渡しをしたいが、構造体を変更する関数が気になる場合は、constキーワードを使用して変更できないようにすることができます(少なくとも簡単にはできません)。

0
追加された