我应该在代码中定义重复文字的常量吗?

时间:2016-02-17 10:07:48

标签: c++ performance constants literals code-size

我有一个像这样的示例代码,其中文字dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) { () -> Void in // catch notifications here } 重复几次。

1

我应该定义一个常量foo(x - 1); y = z + 1; bar[1] = y; ,并用它替换文字吗?

ONE

这种替换是否会提高性能和/或减少机器代码大小,有利于降低代码可读性?文字的重复次数会改变答案吗?

5 个答案:

答案 0 :(得分:3)

它不会为您带来任何性能/内存改进。但是,您应该尝试将代码保持在magical numbers之外。因此,如果您的代码在多个位置存在重复常量,并且在所有这些位置,此常量与逻辑角度相同 ,则最好将其设为命名常量。 / p>

示例:

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 :(得分:1)

取决于。如果您的代码中只有1,并且您询问是否应该替换它们:不要。保持代码清洁。您将没有任何性能或内存优势 - 更糟糕的是,您可能会增加构建时间 但是,如果1是构建时参数:是的,请引入常量!但请选择比ONE更好的名称!

答案 2 :(得分:0)

  

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

不,绝对没有。如果您的名称指示数字的含义(例如NumberOfDummyFoos),如果其值可以更改并且您想要防止必须在十几个位置更新它,那么您可以为此使用常量,但常量ONE绝对不会增加文字1的值。

  

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

在任何实际的实现中,它都没有。

答案 3 :(得分:0)

用命名常量替换文字只有意义, 如果常数的含义是特殊的。用1替换ONE是 在大多数情况下只是开销,并没有添加任何有用的信息 对读者而言,特别是如果它用于不同的功能(索引,计算的一部分等)。如果数组的条目1以某种方式特殊,则使用常量THE_SPECIAL_INDEX=1是有意义的。 对于编译器,它通常没有任何区别。

答案 4 :(得分:0)

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

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