我想知道在诸如C++之类的语言中,静态成员变量通常是如何实现的,以及它们的使用是否会影响实例化对象的大小。
我知道静态成员由该类的所有实例共享,但它是如何共享的呢?如果它影响对象大小,那么有10个静态变量比1个静态变量增加的大小更多吗?
我之所以问这个问题,是因为我能想到两种实现方式:
- 向每个对象添加指向静态数据的指针,类似于某些实现添加指向虚函数表的指针
- 直接引用静态数据,就像全局变量一样,偏移量由链接器/加载器解析
我想知道在诸如C++之类的语言中,静态成员变量通常是如何实现的,以及它们的使用是否会影响实例化对象的大小。
我知道静态成员由该类的所有实例共享,但它是如何共享的呢?如果它影响对象大小,那么有10个静态变量比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
访问的全局对象。A::j
访问的全局对象。无论如何,请不要相信我的意见。我对序列化了解不多。请咨询一些了解的人,并开始另一个话题。 :-) - Nawaz静态成员在编译时由编译器解析。从底层来看,静态变量与全局变量没有什么不同。它们之间的区别只在于您在代码中如何引用它们、它们可见的范围以及它们何时以及如何初始化。