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

fud*_*din 19 c++ static class

假设我有一个类,我有一个静态成员,但我不创建任何类型的对象.内存是否会被静态变量占用?如果它被占用,将它放入课堂有什么意义?

Naw*_*waz 36

没有.

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

struct A
{
    int i;
    static int j;
};
struct B
{
    int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

也就是说,尺寸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).

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

  • +1用于链接到标准的定义,基本上概述了具体答案。 (2认同)

Kev*_*ent 8

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

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