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

时间:2011-01-09 18:39:32

标签: c++ static-members

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

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

我问,因为我可以想到两种可能的方式:

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

2 个答案:

答案 0 :(得分:25)

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

struct A
{
    int i;
    static int j;
};
struct B
{
    int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;

输出:

1

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

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


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

  

静态数据成员不属于   一个类的子对象。 是   只有一份静态数据成员   由所有对象共享   类。

标准中的9.4.2 / 3和7,

  

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

     

初始化静态数据成员   并且像非本地人一样被摧毁   对象(3.6.2,3.6.3)。

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

答案 1 :(得分:6)

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