-1

私はいくつかの関数への参照によって渡されるかなり大きな構造を持つプログラムを書いています。ただし、大きな構造内の小さな情報にアクセスする必要がある関数が他にもいくつかあります。編集ではなく、ただ読むだけです。

構造全体を参照渡しするのではなく、必要な特定の情報をコピーしてそれを参照渡しするだけの 2 番目の構造を作成することを考えていました。

私が疑問に思っているのは、次の2つのことです。

  1. 大きな構造体を参照渡ししているので、実際にはパフォーマンスへの影響はありません。正しい?
  2. 1) が正しい場合でも、編集してはならない構造を渡すのは悪い習慣ですか (編集されない場合でも、ここでは原則について話しています)。

すなわち:

関数を呼び出して構造体を参照渡しすることにより、プログラム構成をセットアップする構成構造体があります。情報提供のみを目的として使用したい情報 (プロセス名、コマンド ライン引数) があります。私が使用したい目的のために意図されていない構造を渡すのは悪い習慣であるかどうかを尋ねています。

4

5 に答える 5

2
  1. 正しい。

  2. const参照によって渡します。編集を許可しなくても、参照渡しのパフォーマンスが向上します。

ちなみに、「大きな構造体」の一部のみがその関数に必要な場合、そのようなフィールドが「それ自体で」何らかの情報を格納することを示している可能性があります。つまり、「大きな構造体」の残りの部分は解釈する必要はありません。それらを正しく。この場合、それらを別の に移動することを検討できます。これはstruct、それ自体が最初の「大きな構造体」のメンバーになります。

于 2013-04-01T14:42:26.113 に答える
2

1) 大きな構造体を参照渡ししているので、実際にはパフォーマンスへの影響はありません。正しい?

正しい。

2) 1) が正しいとしても、編集してはならない構造を通過するのはエチケットが悪いのでしょうか (編集されない場合でも、ここでは原則について話しています)。

関数に参照を受け入れさせてconst、関数が対応する引数の状態を変更しないようにすることができます。

私が使用したい目的のために意図されていない構造を渡すのは悪い習慣であるかどうかを尋ねています。

これが何を意味するのかわかりません。あなたの書き方からすると、これは間違いなく悪い習慣のようです。意図されていないことを行うために何かを使用するべきではありません。これは、オブジェクトのセマンティクスを歪めることを意味します。ただし、残りの質問はこれを暗示しているようには見えません。

むしろ、関数への参照を渡すことに関心があるようです。これにより、関数が引数の状態を変更できる可能性があるためです。ただし、関数が への参照をconst受け取る場合、その引数の状態を変更することはできません。その場合、いいえ、それは悪い習慣ではありません。

関数が構造体の一部のデータ メンバーまたはメンバー関数でのみ動作する必要があるという事実に言及している場合、これも必ずしも悪い設計ではありません。各関数がデータ構造のすべてのメンバーにアクセスすることを要求するのはばかげています。

もちろん、これは関数のセマンティクスと特定のデータ構造について具体的なことを何も知らなくても、私が書くことができる最高のものです。

于 2013-04-01T14:42:39.410 に答える
0

他の人が述べたようにconst&、データを変更していない場合。

ただし、「データを小さいサイズにコピーする必要がありますか」というあなたのポイントstructは、ほとんど見過ごされています。答えは「たぶん」です。

そうしない正当な理由は、それが時間の無駄だということです。文字通り、コピーするのに時間がかかります。

これを行う正当な理由は、サブプロシージャーの有効な状態を低下させることです。グローバル変数 (したがってグローバル状態) にアクセスせず、ポインターが渡されないサブプロシージャーの状態は非常に限られています。状態が制限されたプロシージャは、テストが容易で、多くの場合、理解しやすく、通常はデバッグが容易です。

多くの場合、その関数が抱えている問題を解決するために、その関数に必要な絶対最小量のデータで各関数を呼び出したいとします。すべての関数に「すべてへのポインター」 (参照はポインター) を渡さないようにすれば、この規則を維持でき、多くの場合、コードをより維持しやすくなります。

一方、大きなモノリシック状態から小さなローカルstructs にデータを削除すると、バグやエラーが含まれる可能性があります。

この問題を完全に回避する 1 つの方法は、パラメーターがすべて混ざり合った大きなモノリシックな状態オブジェクトを避けることです。いくつかの質問に答えるために一緒にバンドルされているパラメーターがある場合は、最初から独自のサブstructに配置する必要があります。サブプロシージャーの呼び出しは簡単ですstruct。すでにパラメーターがバンドルされている sub- を渡します。

于 2013-04-01T15:19:08.767 に答える