在函数和类作用域下,用于定义像以下这样的整型编译时常量的语法,哪种语法最好?
static const int kMagic = 64; // (1)
constexpr int kMagic = 64; // (2)
(1)
同样适用于C++98/03编译器,而(2)
至少需要C ++11。这两者之间是否还有其他差异?在现代C ++代码中应该偏好哪个,为什么?
编辑
我用Godbolt's CE尝试了这个示例代码:
int main()
{
#define USE_STATIC_CONST
#ifdef USE_STATIC_CONST
static const int kOk = 0;
static const int kError = 1;
#else
constexpr int kOk = 0;
constexpr int kError = 1;
#endif
return kOk;
}
对于static const
的情况,这是GCC 6.2生成的汇编代码:
main::kOk:
.zero 4
main::kError:
.long 1
main:
push rbp
mov rbp, rsp
mov eax, 0
pop rbp
ret
另一方面,对于constexpr
,它是:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 0
mov DWORD PTR [rbp-8], 1
mov eax, 0
pop rbp
ret
虽然在两种情况下都使用了 -O3
,但我得到了相同的(优化后的)汇编代码:
main:
xor eax, eax
ret
编辑 #2
我尝试了这段简单的代码(在Ideone上实时运行):
#include <iostream>
using namespace std;
int main() {
const int k1 = 10;
constexpr int k2 = 2*k1;
cout << k2 << '\n';
return 0;
}
这表明const int k1
在编译时计算,因为它用于计算constexpr int k2
。
然而,对于double
似乎有不同的行为。我已经为此创建了一个单独的问题,链接在此。
constexpr
方法。它是明确和强制的。无论如何,另一种选择在链接方面并不相同:如果您使用const
(或static
,或两者),它会使变量具有 内部 链接。因此,它们在语义上是不同的。 - Nawazstatic const
无法做到这一点。----这就是我想说的。 - Yves