我相信我有这个问题,但我只是想确认一下。如果我有两个功能,
function A()
{
const Vector3D vectorA(1.0f);
...
}
function B(float var)
{
const Vector3D vectorB(1.0f + var);
...
}
对于函数A()
,vectorA
只会在程序中构造一次,无论A()
次调用多少次?我相信编译器隐式声明它是静态的是吗?
但是在B()
的情况下,每个函数调用需要重构vectorB
吗?
答案 0 :(得分:4)
两个函数都会在每次调用时创建变量。没有隐含的静态。有些编译器可能会选择优化,但它不是语言规范的一部分。
答案 1 :(得分:1)
在这两种情况下都不会在每次通话时创建对象
为什么编译器在第一种情况下会隐式提供static
?
答案 2 :(得分:1)
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?
不要假设。
答案 3 :(得分:1)
答案是不,但是 远离轨道。
static
是一个非常重载的关键字:
static
方法是未在类static
属性是对于类static
函数具有内部链接static
变量,在命名空间范围内,具有内部链接static
变量也称为本地静态;它是在执行流第一次通过其定义时构建的,然后在调用它所属的函数之间保留其状态。在所有这些用途中,单个用户可以(实际上)是隐式的:命名空间范围内的const
或constexpr
变量具有内部链接(就好像它是静态的)除非使用其他存储限定符(例如extern
)。
§3.5计划和联系[basic.link]
3 /具有命名空间范围(3.3.6)的名称具有内部链接(如果它是
的名称)
- 显式声明为
static
的变量,函数或函数模板;或者,- 显式声明为
const
或constexpr
的变量,既未明确声明为extern,也未声明为具有外部链接;或- 匿名工会的数据成员。
不要const
或constexpr
这样从不暗示static
,而是在第二个项目符号中突出显示的变量声明的特定情况在命名空间范围对链接具有相同的效果。