gpt4 book ai didi

c++ - 静态常量 POD 与常量 POD

转载 作者:太空狗 更新时间:2023-10-29 23:06:15 25 4
gpt4 key购买 nike

对于类成员函数本地的 POD:

有什么理由更喜欢 static const int ONE = 1;const int ONE = 1

有什么理由更喜欢 static const float HALF = (float)0.5;const float HALF = (float)0.5

例如对于 A

类中的函数 f
 #ifdef SP
#define float REAL
#else
#define double REAL
#endif

double
A::f(const REAL x)
{
static const REAL HALF = (REAL)0.5;
return max(x, HALF);
}

or

double
A::f(const REAL x)
{
const REAL HALF = (REAL)0.5;
return max(x, HALF);
}

or

double
A::f(const REAL x)
{
const REAL HALF = 0.5f;
return max(x, HALF);
}

最佳答案

在一个函数/方法中,普通的 const 变量可以,例如,从参数中计算出来,并在函数/方法的相应调用中分配一个不同的值,而 static const 一个只能初始化一次(也可能来自参数),后续调用对其值没有任何影响。为了说明这种差异,请看以下演示:

#include <iostream>

using std::cout;
using std::endl;

void
non_static_case(int x, int y) {
const int z = x + y;

cout << z << endl;
}

void
static_case(int x, int y) {
static const int z = x + y;

cout << z << endl;
}

int
main() {
non_static_case(1, 2);
non_static_case(3, 4);

cout << endl;

static_case(1, 2);
static_case(3, 4);
}

输出:

3
7

3
3

你可以清楚地看到static_case函数中的z,在第一次初始化后,在后续调用中不再改变。

值得一提的是,编译器通常使用隐藏标志来指示本地 static 变量是否已初始化。这个标志在函数的每个入口都被检查,这导致很少的开销。尽管如此,在这种特殊情况下,当只考虑基本类型并将变量分配给编译时常量时,我毫不怀疑生成的代码已被编译器优化并且实际上没有隐藏标志用过的。因此,我要说的是,在这种特殊情况下,没有理由偏爱一种方法

如果变量是某个类的成员,实际上适用与函数/方法内的变量相同的规则。 const 成员可以在构造函数初始化列表中计算,并与类的特定实例相关联,而 static const 成员在程序启动初始化期间设置并保持不变用于执行的其余部分,并且在该类的所有实例之间“共享”

关于c++ - 静态常量 POD 与常量 POD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com