假设我有一个类,我有一个静态成员,但我没有创建任何类型的对象。内存是否会被静态变量占用?如果它会被占用,那么将它放入课堂有什么意义呢?
答案 0 :(得分:34)
没有
静态成员不属于类的实例。它们不会增加实例和类大小,即使是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 :(得分:8)
C ++标准没有明确说明何时分配静态内存,只要它在首次使用时可用。也就是说,它很可能在程序初始化期间分配,从而在需要时立即保证其存在,而无需特殊情况代码来检测和执行访问分配。
将静态数据放入类中的目的与将任何其他数据放入类中的目的相同。通过将数据放入类结构中,您将定义封装命名空间,并能够使用访问器和更改器方法来控制访问;反过来,这将允许您验证进入静态存储器的数据,并确保在整个数据使用过程中的一致性。
答案 2 :(得分:-1)
静态变量存储在名为BSS的特殊内存区域中,而类的实例存储在堆中或堆栈中。因此,静态成员是分开存储的。