【发布时间】:2011-06-18 01:01:33
【问题描述】:
假设我有一个类,其中有一个静态成员,但我没有创建该类型的任何对象。静态变量会占用内存吗?如果它被占用了,把它放在一个班级里有什么意义?
【问题讨论】:
假设我有一个类,其中有一个静态成员,但我没有创建该类型的任何对象。静态变量会占用内存吗?如果它被占用了,把它放在一个班级里有什么意义?
【问题讨论】:
没有。
静态成员不属于类的实例。它们甚至不会增加 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/1 来自 C++ 标准 (2003),
静态数据成员不是 一个类的子对象。有 只有一个静态数据成员的副本 由所有对象共享 类。
标准版 9.4.2/3 美元和 7 美元,
一旦静态数据成员被 已定义,即使没有对象也存在 已经创建了它的类。
静态数据成员被初始化 并像非本地一样被销毁 对象(3.6.2、3.6.3).
正如我所说,静态成员更像是全局对象!
【讨论】:
C++ 标准没有明确说明何时分配静态内存,只要它在首次使用时可用。也就是说,它很可能是在程序初始化期间分配的,从而保证它在需要时立即存在,而不需要特殊情况代码来检测和执行访问分配。
将静态数据放入类中的目的与将任何其他数据放入类中的目的相同。通过将数据放入类结构中,您定义了一个封装命名空间,并且能够使用访问器和修改器方法控制访问;反过来,这将允许您验证进入静态内存存储的数据,并确保在使用此数据的整个过程中保持一致性。
【讨论】:
静态变量存储在称为 BSS 的特殊内存区域中,而类的实例存储在堆或堆栈中。所以,静态成员是分开存储的。
【讨论】: