函数静态变量初始化

时间:2015-07-14 21:54:21

标签: c++

我在类非静态函数中有一个静态局部变量。这个静态函数变量是否会与类实例绑定,或者它将被初始化一次,无论您创建此类的实例数多少并调用此函数。

3 个答案:

答案 0 :(得分:5)

如果它是一个函数by_poss对象,那么它的生命周期与函数有关,而不是函数所属的类。

你可以完全琐碎地测试这个:

static

输出:

#include <iostream>

struct Tracked
{
    Tracked() { std::cout << "ctor\n"; }
    Tracked(const Tracked&) { std::cout << "copy\n"; }
    ~Tracked() { std::cout << "dtor\n"; }
};

struct Tester
{
    void foo()
    {
        static Tracked t;
    }
};

int main()
{
    Tester t1;
    Tester t2;

    t1.foo();
    t2.foo();
}

live demo

答案 1 :(得分:2)

首次调用该函数时,它将被初始化一次。它完全独立于任何实例生命周期,以及类本身和非本地静态变量的生命周期。

在C ++ 11中,如果同时从多个线程调用函数,则保证此初始化是线程安全的。在此之前,它因编译器而异。 (特别是,本地静态变量初始化在MSVC中线程安全,直到VS2015,他们最终实现了这一点。)

答案 2 :(得分:0)

类成员函数只是静态内存中的常用函数,隐藏参数 this 。当一个类实例调用这个函数时,一个指向实例内存​​的指针(这是你的整个实例,rest是编译器魔术)只是添加到 this 的参数列表中。

因为你的函数是静态的而不是一些动态内存,你的局部变量也是静态的 - &gt;只初始化了一次。