静态成员变量如何影响对象大小?

Rob*_*nes 12 c++ static-members

我想知道静态成员变量通常是如何在C++等语言中实现的,如果它们的使用会影响实例化对象的大小.

我知道静态成员由该类的所有实例共享,但它是如何共享的?如果它影响对象大小,那么有10个静态变量会增加大于1的大小吗?

我问,因为我可以想到它可以实现的两种方式:

  • 向每个对象添加一个指向静态数据的指针,类似于某些实现添加指向虚函数表的指针的方式
  • 静态数据直接引用就像一个全局变量,偏移量由链接器/加载器解析

Naw*_*waz 25

在C++中,静态成员不属于类的实例.它们不会增加实例和类的大小,即使是1位!

struct A
{
    int i;
    static int j;
};
struct B
{
    int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

也就是说,尺寸AB完全相同.静态成员更像是通过访问的全局对象A::j.

请参阅ideone上的演示:http://www.ideone.com/YeYxe


来自C++标准(2003)的$ 9.4.2/1,

静态数据成员不是 类的子对象的一部分.有只有一个拷贝由类的所有对象共享的静态数据成员.

从标准中获得9.4.2/3和7美元,

一旦定义了静态数据成员,即使没有创建其类的对象,它也存在.

静态数据成员的初始化和销毁​​与非本地对象完全相同(3.6.2,3.6.3).

正如我所说,静态成员更像是全局对象!

  • 静态变量不是对象本身的一部分,不应该像它一样进行序列化. (4认同)
  • @Robert这可以从POD类型的定义中推断出来; 标准仔细规定添加"静态"成员不能将POD类型转换为非POD类型.并严格定义POD类型的内存布局. (3认同)

Vin*_*Pai 6

静态成员在编译时由编译器解析.在许多方面,静态变量与全局变量没有什么不同.差异仅在于您在代码中引用它们的方式,它们可见的范围以及它们初始化的方式和时间.

  • @David:当然,我不是Vinay,但我不确定哪种参考资料可以解决这个问题.我认为Vinay的答案最好分别支持C++和Java的语言规范中的*not*:定义中没有任何内容表明静态变量*会对类实例施加运行时开销; 因此,他们没有. (2认同)