0

1リテラルが数回繰り返されるこのようなコード例があります。

foo(x - 1);
y = z + 1;
bar[1] = y;

定数を定義しONE、リテラルをそれに置き換える必要がありますか?

constexpr int ONE = 1;
foo(x - ONE);
y = z + ONE;
bar[ONE] = y;

この置き換えにより、パフォーマンスが向上したり、コードの可読性が低下するようにマシンコードのサイズが縮小されたりしますか? リテラルの繰り返し回数によって答えが変わるでしょうか?

4

5 に答える 5

3

パフォーマンスやメモリの改善はありません。ただし、魔法の数からコードをきれいに保つようにしてください。したがって、コード内のいくつかの場所で定数が繰り返され、それらすべての場所でこの定数が論理的な観点から同じである場合は、名前付き定数にすることをお勧めします。

例:

const int numberOfParticles = 10; //This is just an example, it's better not to use global variables.

void processParticlesPair(int i, int j) {
    for (int iteration = 0; iteration < 10; ++iteration) {
        //note, that I didn't replace "10" in the line above, because it is not a numberOrParticles, 
        //but a number of iterations, so it is a different constant from a logical point of view.


        //Do stuff
    }
}

void displayParticles() {
    for (int i = 0; i < numberOfParticles; ++i) {
        for (int j = 0; j < numberOfParticles; ++j) {
            if (i != j) {
                processParticlesPair(i, j);
            }
        }
    }
}
于 2016-02-17T10:11:44.510 に答える
1

依存します。コードに sがあるだけ1で、それらを置き換える必要があるかどうかを尋ねる場合: しないでください。コードをきれいに保ちます。パフォーマンスやメモリの利点はありません。さらに悪いことに、ビルド時間が長くなる可能性があり
ます1。ただし、よりも適切な名前を選択してONEください。

于 2016-02-17T10:13:49.190 に答える
0

定数を定義しONE、リテラルをそれに置き換える必要がありますか?

いいえ、絶対に違います。数値の意味を示す名前(例: NumberOfDummyFoos) がある場合、その値が変更される可能性があり、多数の場所で更新する必要がないようにしたい場合は、そのために定数を使用できますが、定数ONEは絶対に追加しません。リテラル上の値1

この置き換えにより、パフォーマンスが向上したり、コードの可読性が低下するためにマシンコードのサイズが縮小されたりしますか?

現実的な実装では、そうではありません。

于 2016-02-17T10:13:14.320 に答える
0

リテラルを名前付き定数に置き換えることは、定数の意味が特別な場合にのみ意味があります。1withの置換ONEは、ほとんどの場合、単なるオーバーヘッドであり、特に異なる関数 (インデックス、計算の一部など) で使用されている場合は、リーダーに有用な情報を追加しません。配列のエントリ 1 が何らかの形で特別な場合、定数を使用するTHE_SPECIAL_INDEX=1ことは理にかなっています。コンパイラの場合、通常は違いはありません。

于 2016-02-17T10:13:22.003 に答える
0

アセンブリでは、通常、1 つの定数値が他の値と同じ量のメモリを使用します。ソース コードで定数値を設定することは、最適化よりも人間にとって便利です。

この場合、そのような方法で ONE を使用しても、パフォーマンスや読みやすさは向上しません。それが、おそらくこれまでソース コードで見たことがない理由です ;)

于 2016-02-17T10:16:49.653 に答える