C++函数体中的Const变量
Const variable in C++ function body
我相信我已经了解了,但我只想确认一下。如果我有两个功能,
function A()
{
const Vector3D vectorA(1.0f);
...
}
function B(float var)
{
const Vector3D vectorB(1.0f + var);
...
}
在函数A()
的情况下,无论A()
调用多少次,程序中是否只构造vectorA
一次?我相信编译器隐式地声明它是静态的是吗?但在B()
的情况下,每次函数调用都需要重构vectorB
?
每次调用这两个函数时,都会创建变量。不存在隐含的静态。有些编译器可能会选择优化,但这不是语言规范的一部分。
答案是否,但你并不是偏离轨道。
static
是一个非常重载的关键字:
static
方法是不在类的实例上调用的方法static
属性对于类的所有实例只存在一次static
函数具有内部链接- 在命名空间范围内的
static
变量具有内部链接 - 在函数范围内,
static
变量也称为局部静态变量;它是在执行流第一次通过其定义时构建的,然后在对其所属函数的调用之间保留其状态
在所有这些使用中,只有一个可以(实际上)是隐式的:命名空间作用域中的const
或constexpr
变量具有内部链接(就像它是静态的一样),除非使用另一个存储限定符(如extern
)。
§3.5程序和链接[basic.link]
3/具有命名空间作用域(3.3.6)的名称如果是的名称,则具有内部链接
- 显式声明为
static
的变量、函数或函数模板;或者- 显式声明为CCD_ 16或CCD_;或
- 匿名联合的数据成员
请注意,const
或constexpr
因此从不暗示static
,但在第二个要点中突出显示的特定情况下,在命名空间范围中声明的变量对链接具有相同的影响。
否。在这两种情况下,每次调用都会创建对象
为什么编译器在第一种情况下要隐式提供static
ness?
In the case of function A(), will vectorA only be constructed once in the program, no matter how many A() calls?
没有。如果您只想要vectorA
的一个构造,则需要将其声明为static
:
const static Vector3D vectorA(1.0f);
I believe the compiler implicitly declares it static yes?
不要想当然。
相关文章:
- 在内存不足之前,我可以声明多少个 const 变量?
- 当设置为 const 变量时使用 nullptr
- 声明与 const 变量和成员函数相同的标识符
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 在成员函数之间传递const变量为数组的索引
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- C 编译器可以执行用于返回值的命名const变量的RVO
- 如何访问一系列const变量作为const数组
- C 错误C3892:您无法分配const变量
- 是否可以在C++中推迟 const 变量的初始化,例如 Java 的"blank final"功能?
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- 使用非const变量代替所需的const变量(C )
- 使用const变量时,非静态数据成员的使用无效
- 定义,初始化全局const变量是安全的吗?
- const vs non-const变量一旦分配就没有变化
- 为什么设置const变量(将以相同的值存储)会导致不同的结果
- CPP中的私有静态常规成员变量与const变量
- 在避免新分配的同时,const变量的复杂初始化
- 如何通过其地址更改const变量的值