我有一个这样的示例代码,其中文字1
重复了几次。
foo(x - 1);
y = z + 1;
bar[1] = y;
我应该定义一个常量ONE
,并用它替换文字吗?
constexpr int ONE = 1;
foo(x - ONE);
y = z + ONE;
bar[ONE] = y;
这种替换是否会提高性能和/或减小机器代码大小,从而降低代码的可读性?字面重复的次数会改变答案吗?
它不会为您带来任何性能/内存改进。但是,您应该尽量保持代码远离神奇的数字。因此,如果代码中的多个位置存在重复常量,并且从逻辑角度来看,在所有这些地方,该常量都是相同的,则最好将其设置为命名常量。
例:
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);
}
}
}
}
取决于。如果你的代码中只有1
,你问你是否应该替换它们:DONT。保持代码干净。您将没有任何性能或内存优势 - 更糟糕的是,您可能会增加构建时间
但是,如果1
是构建时参数:是的,请引入一个常量!但是选择一个比ONE
更好的名字!
我应该定义一个常量
ONE
,并用它替换文字吗?
不,绝对不是。如果您有一个指示数字含义的名称(例如 NumberOfDummyFoos
),如果它的值可以更改并且您希望防止必须在十几个位置更新它,那么您可以使用常量,但是常量ONE
绝对不会在文字1
上增加任何值。
这种替换是否会提高性能和/或减小机器代码大小,从而降低代码的可读性?
在任何实际实现中,它都不会。
用命名常量替换文字才有意义,如果常量的含义是特殊的。将1
替换为ONE
是在大多数情况下只是开销,并且不会添加任何有用的信息给读者,特别是如果它用于不同的功能(索引、计算的一部分等)。如果数组的条目 1 在某种程度上是特殊的,则使用常量THE_SPECIAL_INDEX=1
是有意义的。对于编译器来说,它通常没有任何区别。
在汇编中,一个常量值通常占用的内存量与其他任何常量值相同。 在源代码中设置常量值对人类来说比优化更方便。
在这种情况下,以这种方式使用 ONE 既不是性能增强,也不是可读性增强。 这就是为什么你可能从未在源代码中看到过它;)