2016-04-14 35 views
3

私はクラス内で多くのオーバーロードされた関数を持っています。この場合、int32_tデータをクラスのメンバ変数として宣言する必要がありますので、各関数で繰り返し宣言していませんか? Fill関数は常に参照によって値を設定しているので、関数ごとに毎回宣言する必要はありません。多くの関数で使用される変数をメンバ変数として宣言すべきですか?

約20以上ここに記載されていないこれらの機能があります:

void TransmitInfo(TypeA &dp, Id &tc) 
{ 
    //do lots of other work here 
    int32_t data; 
    while (dp.Fill(data)) //Fill accepts a reference variable, "data" gets populated 
    { 
     Transmit(tc, data); 
    } 
} 

void TransmitInfo(TypeB &dp, Id &tc) 
{ 
    //do lots of other work here 
    int32_t data; 
    while (dp.Fill(data)) 
    { 
     Transmit(tc, data); 
    } 
} 

void TransmitInfo(TypeC &dp, Id &tc) 
{ 
    //do lots of other work here 
    int32_t data; 
    while (dp.Fill(data)) 
    { 
     Transmit(tc, data); 
    } 
} 
+3

このクラスを同時に呼び出すことはできますか?一般的に、内部のメンバーを一時的な値に使用することは、コードが**スレッドセーフでないことをほとんど常に保証するので、悪い考えです。 –

+0

なぜあなたは私たちにお尋ねしますか?違いを知っていますか?あなたはそれがあなたの場合にどのように適用されるのか分かりますか?利点と欠点を知っていますか?情報に基づいた決定を下し、あなた自身の背後に立つ準備をしてください**。 – SergeyA

+4

簡単な質問の1つ*オブジェクトのプロパティ*ですか? –

答えて

2

任意のタイプの一時データにメンバー変数を使用することを控えてください。その理由は、コードがスレッドセーフではないことを保証し、並列コンピューティングの今日の時代には大きな欠点であるからです。 int32_tを割り当てるコストはごくわずかですが、スレッド安全性を維持するために関数内に割り当てる方がしばしばです。単一のint割り当てが目立つようになる前に、100万回以上割り当てる必要があります。その場合でも、合計損失はマイクロ秒単位になります。

このような高度なマイクロ最適化に頼らなければならない最適化の難しさを経験した場合は、アルゴリズムを再試行して、スケーリングを作成する必要があります。チョークポイントではありません。 (シリアルアルゴリズムからピコ秒​​をシェービングするのではなく、良い並行アルゴリズムを使用する方が良いでしょう)

2

は、絶対にこれをしません。それが機能の寿命のための唯一の一時的な場合は、それをローカルに保つ。

そうでなければ、解決するよりも多くの問題が発生します。例えばマルチスレッドとシリアライゼーション。

このようなマイクロ最適化をコンパイラに任せます。

5

変数を宣言する場所を選択するときにスコープだけを考慮する必要はありません。変数の存続期間とそれが作成される時期が重要です。

関数内で変数を宣言すると、その関数が呼び出されるたびに変数が作成されます(必要に応じて再帰!)。そして、その関数が終了すると破壊されます。 これらの作成/破壊は、単純タイプの場合はCPUのためのnoopsであり、int32_tです。

クラス内で宣言すると、作成するオブジェクトごとに変数のコピーが1つだけ取得されます。あなたの関数のうちの1つが別の(またはそれ自身)を呼び出す場合は、と同じ変数を使用します。また、オブジェクトのサイズも大きくなります。あなたの変数は使用されていなくてもメモリを消費します。

したがって、最終行は用に設計された目的のために異なる種類の変数を使用します。

  • 関数が実行中に何かを覚えておく必要がある場合、それは関数変数です。
  • 関数が呼び出しを介して何かを記憶する必要がある場合は、関数変数staticです。
  • オブジェクトがメンバー呼び出し全体で何かを覚えておく必要がある場合、メンバー変数です。
  • クラスがすべてのオブジェクトにわたって何かを覚えておく必要がある場合は、クラス変数staticです。

他のものはすべて混乱につながります。

関連する問題