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

时间:2011-01-30 09:04:32

标签: c++ class static

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

3 个答案:

答案 0 :(得分:34)

没有

静态成员不属于类的实例。它们不会增加实例和类大小,即使是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> $ 9.4.2 / 1,

  

静态数据成员不属于   一个类的子对象。有   只有静态数据成员的一个副本   由所有对象共享   类。

标准中的9.4.2 / 3和7,

  静态数据成员一旦

  定义,即使没有对象也存在   已经创建了它的类。

     

初始化静态数据成员   并且像非本地人一样被摧毁   对象(3.6.2,3.6.3)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:-1)

静态变量存储在名为BSS的特殊内存区域中,而类的实例存储在堆中或堆栈中。因此,静态成员是分开存储的。