繁体   English   中英

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

[英]How do static member variables affect object size?

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

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

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

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

在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.2 / 1,

静态数据成员不是类的子对象的一部分 该类的所有对象共享的静态数据成员只有一个副本

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM