我在类非静态函数中有一个静态局部变量。这个静态函数变量是否会与类实例绑定,或者它将被初始化一次,无论您创建此类的实例数多少并调用此函数。
答案 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();
}
答案 1 :(得分:2)
首次调用该函数时,它将被初始化一次。它完全独立于任何实例生命周期,以及类本身和非本地静态变量的生命周期。
在C ++ 11中,如果同时从多个线程调用函数,则保证此初始化是线程安全的。在此之前,它因编译器而异。 (特别是,本地静态变量初始化在MSVC中不线程安全,直到VS2015,他们最终实现了这一点。)
答案 2 :(得分:0)
类成员函数只是静态内存中的常用函数,隐藏参数 this 。当一个类实例调用这个函数时,一个指向实例内存的指针(这是你的整个实例,rest是编译器魔术)只是添加到 this 的参数列表中。
因为你的函数是静态的而不是一些动态内存,你的局部变量也是静态的 - &gt;只初始化了一次。