如果没有创建该类的对象,该类的静态成员是否会占用内存?

新手上路,请多包涵

假设我有一个类,其中有一个静态成员,但我没有创建该类型的任何对象。静态变量会占用内存吗?如果它会被占用,把它放在一个班级有什么意义?

原文由 user379888 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 666
2 个回答

不。

静态成员不属于类的实例。它们甚至不会增加 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.23 美元和 7 美元,

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

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

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

原文由 Nawaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

C++ 标准没有明确说明何时分配静态内存,只要它在首次使用时可用。也就是说,它很可能在程序初始化期间分配,从而保证它在需要时立即存在,而不需要特殊情况代码来检测和执行访问分配。

将静态数据放入类中的目的与将任何其他数据放入类中的目的相同。通过将数据放入类结构中,您定义了一个封装命名空间,并且能够使用访问器和修改器方法控制访问;反过来,这将允许您验证进入静态内存存储的数据,并确保在整个数据使用过程中的一致性。

原文由 Kevin Lacquement 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题