在函数内声明const而不是变量有什么好处吗?

时间:2011-08-03 22:22:38

标签: c++ variables constants

如果我的功能只存在很短的时间,那么使颜色列表保持不变会有所作为吗?

string getrandcolor(){
    const string colors[5] = {"red", "blue", "green", "yellow", "purple"};
    return colors[rand() % 5];
}

注意:实际的颜色列表包含数百种颜色,而不仅仅是我展示的小样本,不确定这是否也有所不同。

6 个答案:

答案 0 :(得分:16)

它可以防止您意外覆盖您不想改变的变量。 “哎呀!” - 保护可能是const最重要的功能。

假设编译器可以将某种优化视为知道变量不应该改变,但是我的测试从未发现在你描述的情况下实际上做了一些有意义的事情。

const static 确实在您的特定代码示例中有重要区别。因为colors []数组是本地的,所以每次调用getrandcolor()函数时都必须重新构造它。这意味着每次调用getrandcolor()时,字符串构造函数都会运行五次,这非常浪费。 const static 意味着数据只构造一次 - 第一次运行函数 - 并放入共享内存空间。

答案 1 :(得分:6)

在表现方面?不,可能不是。您的数组看起来也可能是static,然后可能

在代码风格方面?有可能。虽然添加const会使您的代码变得有点冗长,但它也清楚地表明数据不会被修改。这是记录安全


理想情况下,默认情况下,C ++中的所有对象都是常量,并且您必须编写mutable来使它们成为变量。这都是倒退了!

答案 2 :(得分:2)

如果你在谈论表现,那么:没有,它应该没有任何区别。

答案 3 :(得分:2)

通过将局部变量声明为const,您将获得以下好处:

  • 正确性:编译器将确保您不会意外更改变量的值。
  • 清晰度:您清楚地记录变量是常数。

(顺便说一下,我不确定那个具体例子中的常量是什么。更快......)

答案 4 :(得分:2)

谈论性能,还有代码可读性,你应该在函数外部创建“colors”变量(因为一个百大小的数组是相当大量的代码,掩盖了函数的逻辑)或者在初始化函数中,或在全球范围内。 如果你不考虑提取这个变量,至少要把它变成静态的。

如果仅在程序执行期间的短时间内使用此数组,您可以考虑在第一次调用getcolors之前填充它,并在您确定不再需要它时最终释放它。

答案 5 :(得分:1)

略有不同的例子:

const int *global_ptr = 0;

void bar();

void foo() {
    int x = 1;
    global_ptr = &x;
    bar();
    std::cout << x << "\n";
}

编译器无法优化最后一行使用值1,因为据他所知,bar()global_ptr的值,将其转换为int*,并通过它修改x。这将是一个有点冒险的编码,但抛弃一个const限定符并且变异是有效的,前提是referand真的是可变的,所以编译器必须允许它。

但是,如果x被标记为const,那么bar() 无效就会抛弃const和mutate,因此优化器可以自由使用假设x在打印时仍保留值1

优化器肯定会识别这种优化的编译时常量,所以我不会惊讶地发现它对发出的代码产生了影响。我不知道它对性能有多大差异。生成识别常量的情况并不困难,例如用一些(更便宜的)位twiddling替换(昂贵的)除法,或者可以允许在编译时计算涉及x和一堆其他常量的表达式。运行时。

此外,链接时优化可能允许bar内联,在这种情况下,链接时优化器可以更密切地检查其内容,并且可能能够排除其修改x甚至在非常数的情况下。

但是,在您的示例中,对colors的引用不能转义为未知代码,因此不会产生差异。无论如何,const字符串可能比使用const int更难优化,因此使用const进行一些优秀的优化的可能性更小。