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

要看。如果您的代码中只有1s 并且您询问是否应该替换它们:不要。保持代码干净。您不会有任何性能或内存优势 - 更糟糕的是,您可能会增加构建时间
如果1是构建时间参数:是的,请引入一个常量!但是选择一个更好的名字而不是ONE

于 2016-02-17T10:13:49.190 回答
0

仅当常量的含义特殊时,用命名常量替换文字才有意义。1在大多数情况下,替换ONE只是开销,并且不会向读者添加任何有用的信息,特别是如果它用于不同的功能(索引、计算的一部分等)。如果数组的条目 1 有点特殊,那么使用常量THE_SPECIAL_INDEX=1是有意义的。对于编译器,它通常没有任何区别。

于 2016-02-17T10:13:22.003 回答
0

我应该定义一个常量ONE,并用它替换文字吗?

不,绝对不是。如果您有一个表示数字含义的名称(例如NumberOfDummyFoos),如果它的值可以更改并且您希望避免在十几个位置更新它,那么您可以为此使用常量,但常量ONE绝对不会添加文字上的值1

这种替换是否会提高性能和/或减少机器代码大小以降低代码可读性?

在任何实际的实现中,它都不会。

于 2016-02-17T10:13:14.320 回答
0

在汇编中,一个常数值通常与其他常数值占用相同的内存量。在源代码中设置一个常量值对人类来说比优化更方便。

在这种情况下,以这种方式使用 ONE 既不是性能增强,也不是可读性增强。这就是为什么您以前可能从未在源代码中看到过它;)

于 2016-02-17T10:16:49.653 回答