我想知道静态成员变量通常是如何在C ++等语言中实现的,以及它们的使用是否会影响实例化对象的大小。
我知道静态成员由该类的所有实例共享,但它是如何共享的?如果它影响对象大小,是否会有10个静态变量添加的大小超过1?
我问,因为我可以想到两种可能的方式:
答案 0 :(得分:25)
在C ++中,静态成员不属于类的实例。它们不会增加实例和类的大小,即使是1位!
struct A
{
int i;
static int j;
};
struct B
{
int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
输出:
1
也就是说,A
和B
的大小完全相同。静态成员更像是通过A::j
访问的全局对象。
请参阅ideone上的演示:http://www.ideone.com/YeYxe
静态数据成员不属于 一个类的子对象。 是 只有一份静态数据成员 由所有对象共享 类。
标准中的9.4.2 / 3和7,
一旦静态数据成员 定义,即使没有对象也存在 已经创建了它的类。
初始化静态数据成员 并且像非本地人一样被摧毁 对象(3.6.2,3.6.3)。
正如我所说,静态成员更像是全局对象!
答案 1 :(得分:6)
静态成员在编译时由编译器解析。在许多方面,静态变量与全局变量没有什么不同。差异仅在于您在代码中引用它们的方式,它们可见的范围以及它们初始化的方式和时间。