类中静态变量的地址

Address of static variable in class

本文关键字:地址 变量 静态      更新时间:2023-10-16

如果我有一个带有静态变量的类:

class A {
  public:
    ...
  private:
    static int var;
}

class A的多个实例是否会对静态变量var使用相同的地址? 如果不是,将变量定义为指针是否会导致相同的地址?即:

class A {
  public:
    ...
  private:
    static int* var;
}

类的所有实例将使用相同的副本,从而使用静态变量的地址。如果是否将其声明为指针并不重要。

无论如何,

A 的所有实例都将共享相同的var实例。如果我们看一下C++标准部分的草案9.4.2静态数据成员1 段说(强调我的):

静态数据成员不是类的子对象的一部分。如果将静态数据成员声明thread_local则每个线程都有一个成员副本。如果未声明静态数据成员thread_local则存在该类的所有对象共享的数据成员的一个副本。

此外,第2款说:

[...][ 注意:定义静态数据成员后,即使没有创建其类的对象,它仍然存在。[...]

所有实例都将看到静态变量的相同地址,因为该变量只有一个实例(这是static变量的全部意义)。显然,如果只有一个实例,它只能存在于一个地方。无论是int还是指针,对于指针,您只有一个可以使用的指针实例。