函数静态变量初始化

Function static variables initialization

本文关键字:初始化 变量 静态 函数      更新时间:2023-10-16

在类非静态函数中有一个静态局部变量。这个静态函数变量是与类实例绑定,还是只初始化一次,不管你创建了多少个类实例并调用了这个函数

如果它是一个函数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的参数列表中。

因为你的函数是静态的,而不是一些动态内存块,你的局部变量也是静态的->初始化一次