让我们用C++14编写以下代码。
using namespace std;
void foo(int a)
{
cout << a;
}
int main()
{
//version1
foo(13);
//version2
static constexpr int tmp = 13;
foo(tmp);
return 0;
}
编译器是否会自动将版本2优化为版本1,这样一来 static constexpr
变量将被内联(类似于C语言中的定义在处理过程中被处理)?如果是这样,有什么规则?如果只是内联,它还会被内联吗?constexpr
或 static const
?
在 "as if "规则下,编译器有很大的自由度,可以根据自己的需要进行优化。考虑到你发布的代码相当琐碎的性质,编译器同样能够优化 "版本2",即使你删除了 static constexpr
从定义中删除。编译器可以看到你在变量的初始化和使用之间没有改变它的值,它可以看到使用是一个编译时的值,所以它可以用初始化值来调用那个函数。如果它能看到定义,甚至可以把函数本身优化掉。
任何一个特定的编译器是否会优化掉一些代码,取决于编译器的设置和代码的具体细节(特别是在值的创建和使用之间介入的代码)。这方面没有 "规则"。
从 http:/eel.isc++draftdcl.constexpr#1.句子-3。
A 功能或 静态数据成员 用constexpr或consteval指定符声明的函数或变量是隐式的。