声明局部变量为const有什么好处吗?

问题描述 投票:0回答:6

如果我有一个只存在很短时间的函数,将颜色列表设置为常量会有什么不同吗?

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

注意:实际的颜色列表包含数百种颜色,而不仅仅是我展示的小样本,不确定这是否会产生影响。

c++ variables constants
6个回答
23
投票

它可以防止您意外覆盖本来不想更改的变量。 “哎呀!”——保护可能是

const
最重要的功能。

假设编译器可以通过知道变量不应该改变来推测某种优化,但我的测试从未发现在您描述的情况下真正做了一些有意义的事情。

const static does 在您的特定代码示例中具有重要的区别。因为您的 color[] 数组是本地的,所以每次调用

getrandcolor()
函数时都必须重新构造它。这意味着每次调用
getrandcolor()
时,字符串构造函数都会运行五次,这是非常浪费的。 const static 意味着数据仅构造一次(函数第一次运行时)并放入共享内存空间。


7
投票

在性能方面?不,可能不会。看起来你的数组也可能是

static
,然后也许是

在代码风格方面?可能吧。虽然添加

const
会让你的代码有点冗长,但它也清楚地表明数据是不可修改的。这既记录安全


理想情况下,C++ 中的所有对象默认都是常量,您必须编写

mutable
才能使它们成为变量。一切都倒退了!


2
投票

如果您谈论的是性能,那么:,它应该没有任何区别。


2
投票

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

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

(顺便说一句,我不确定该特定示例中的常量是什么。很快就会...)


2
投票

谈论性能和代码可读性,您应该在函数外部创建“颜色”变量(因为一百个大小的数组是相当大量的代码,掩盖了函数的逻辑)或者在初始化函数中,或者在全球层面。 如果您不考虑提取此变量,至少将其设为静态。

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


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 限定符和变异是有效的,因此编译器必须允许它。

但是,如果

x
被标记为
const
,那么 bar() 放弃 const 并进行变异将是
invalid
,因此优化器可以自由地假设
x
仍然保留值
1
,当已打印。

优化器确实会识别这种优化的编译时常量,因此看到它对发出的代码产生影响我不会感到惊讶。我不知道这对性能有多大影响。生成这样的情况并不难:识别一个常量可以用一些(更便宜的)位调整来替换(昂贵的)除法,或者可以允许涉及

x
和一堆其他常量的表达式在编译时而不是运行时计算.

此外,链接时优化可能允许内联

bar
,在这种情况下,链接时优化器可以更仔细地检查其内容,并且即使在非常量情况下也可能能够排除其修改
x
.

但是,在您的示例中,对

colors
的引用不能转义为未知代码,因此不会出现差异。不管怎样,const string 可能比 const int 更难优化,所以你通过使用
const
来实现一些出色的优化的机会就更小了。

© www.soinside.com 2019 - 2024. All rights reserved.