【发布时间】:2015-06-28 13:14:12
【问题描述】:
我知道这么简单的函数会被内联:
int foo(int a, int b){
return a + b;
}
但我的问题是,编译器不能自动检测到这与以下内容相同吗:
int foo(const int a, const int b){
return a + b;
}
既然可以检测到,为什么我需要在任何地方输入const?我知道由于编译器的进步,inline 关键字已经过时了。 const 是不是也该这么做了?
【问题讨论】:
-
您不必为编译器输入
const,而是为自己输入。如果你试图改变它的值,你是在告诉编译器踢你。 -
你的例子不是很好。在这种特殊情况下,当编译器将其降低为 SSA 形式时,它将看到
a和b未分配给并且非volatile,因此它们实际上是@987654330 @,并采取相应的行动。const在应用于 指针 或作为函数接口(其签名)的一部分时功能要强大得多,因为那时编译器可以依赖函数的 Promise 进行优化。跨度> -
inline已过时远。它允许函数的多个定义存在于程序中而不违反 ODR。 -
@JonathanMee 编译器可以检测变量是否被修改。没有编译器是足够好的读心器来检测变量是否应该被修改,这就是
const存在的原因。 -
@JonathanMee 不。如果您将函数定义放在名称空间范围内的标头中,请不要将其标记为
inline,并将该标头包含在多个源文件中,您将得到一个链接器错误。如果您做将其标记为inline,则不会出现该错误。
标签: c++ constants qualifiers