我是否应该为代码中的重复文字定义常量



我有一个这样的示例代码,其中文字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 既不是性能增强,也不是可读性增强。 这就是为什么你可能从未在源代码中看到过它;)

相关内容

  • 没有找到相关文章

最新更新