C++中静态constexpr变量是否内联?[重复]

问题描述 投票:1回答:2

让我们用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语言中的定义在处理过程中被处理)?如果是这样,有什么规则?如果只是内联,它还会被内联吗?constexprstatic const ?

c++ optimization static inline constexpr
2个回答
1
投票

在 "as if "规则下,编译器有很大的自由度,可以根据自己的需要进行优化。考虑到你发布的代码相当琐碎的性质,编译器同样能够优化 "版本2",即使你删除了 static constexpr 从定义中删除。编译器可以看到你在变量的初始化和使用之间没有改变它的值,它可以看到使用是一个编译时的值,所以它可以用初始化值来调用那个函数。如果它能看到定义,甚至可以把函数本身优化掉。

任何一个特定的编译器是否会优化掉一些代码,取决于编译器的设置和代码的具体细节(特别是在值的创建和使用之间介入的代码)。这方面没有 "规则"。


1
投票

http:/eel.isc++draftdcl.constexpr#1.句子-3。

A 功能或 静态数据成员 用constexpr或consteval指定符声明的函数或变量是隐式的。

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