函数静态变量初始化
Function static variables initialization
在类非静态函数中有一个静态局部变量。这个静态函数变量是与类实例绑定,还是只初始化一次,不管你创建了多少个类实例并调用了这个函数
如果它是一个函数static
对象,那么它的生命周期与函数有关,而不是与函数所属的类有关。
你可以简单地测试一下:
#include <iostream>
struct Tracked
{
Tracked() { std::cout << "ctorn"; }
Tracked(const Tracked&) { std::cout << "copyn"; }
~Tracked() { std::cout << "dtorn"; }
};
struct Tester
{
void foo()
{
static Tracked t;
}
};
int main()
{
Tester t1;
Tester t2;
t1.foo();
t2.foo();
}
输出:ctor
dtor
(现场演示)
将在第一次调用该函数时初始化一次。它完全独立于任何实例的生命周期,类本身的生命周期,以及非局部静态变量的生命周期。
在c++ 11中,如果从多个线程同时调用该函数,则保证该初始化是线程安全的。在此之前,它因编译器而异。(特别是,在VS2015之前,局部静态变量初始化在MSVC中不是线程安全的,在VS2015中他们最终实现了这一点)。
类成员函数只是静态内存中带有隐藏参数this的普通函数。当一个类实例调用这个函数时,一个指向实例内存的指针(这是你的整个实例,其余部分是编译器的魔法)会被添加到this的参数列表中。
因为你的函数是静态的,而不是一些动态内存块,你的局部变量也是静态的->初始化一次
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量