C++函数体中的Const变量

Const variable in C++ function body

本文关键字:Const 变量 函数体 C++      更新时间:2023-10-16

我相信我已经了解了,但我只想确认一下。如果我有两个功能,

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变量也称为局部静态变量;它是在执行流第一次通过其定义时构建的,然后在对其所属函数的调用之间保留其状态

在所有这些使用中,只有一个可以(实际上)是隐式的:命名空间作用域中的constconstexpr变量具有内部链接(就像它是静态的一样),除非使用另一个存储限定符(如extern)。

§3.5程序和链接[basic.link]

3/具有命名空间作用域(3.3.6)的名称如果是的名称,则具有内部链接

  • 显式声明为static的变量、函数或函数模板;或者
  • 显式声明为CCD_ 16或CCD_;或
  • 匿名联合的数据成员

请注意,constconstexpr因此从不暗示static,但在第二个要点中突出显示的特定情况下,在命名空间范围中声明的变量对链接具有相同的影响。

否。在这两种情况下,每次调用都会创建对象
为什么编译器在第一种情况下要隐式提供staticness?

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?

不要想当然。