sizeof不计入静态数据成员,因其是独立于对象的全局变量,存储在.data或.bss段,地址固定且生命周期贯穿整个程序,故对象大小仅由非静态成员、虚表指针、虚基表指针及对齐填充决定。

sizeof 不计入静态数据成员。
C++ 中类对象的大小只反映该对象实例所占的内存布局,而静态数据成员本质上是带作用域的全局变量,存储在 .data 或 .bss 段,与任何具体对象无关。它不随对象创建/销毁而分配/释放,也不存放在对象的栈或堆内存中。
静态数据成员地址和普通成员地址完全不同
- 普通数据成员地址是相对于对象起始地址的偏移(比如
ebp-4h),每次 new 一个对象,地址都不同; - 静态数据成员地址是固定常量(比如
0x004237A4),整个程序生命周期内不变; - 因此,
sizeof计算时根本不会把它纳入对象内存块的范围。
常见误判场景
- 看到类里声明了
static int count;,就以为它会增加对象体积; - 在调试器里观察对象内存布局,发现静态成员没出现在对象内存区域,却怀疑是编译器优化漏掉了;
- 把
sizeof(ClassName)和sizeof(ClassName::count)混为一谈——后者是int大小(通常是 4),但前者完全不包含它。
实际验证方式
class A {
public:
int x;
static int y;
};
int A::y = 0;
// 输出结果:4(不是 8)
std::cout << sizeof(A) << std::endl;注意:
-
static int y必须在类外定义(int A::y = 0;),否则链接失败; - 即使你删掉这行定义,
sizeof(A)还是 4 —— 编译期就确定了,不依赖链接是否存在该符号; - 如果类里有虚函数,
sizeof会多出一个虚表指针(通常 8 字节),但这和静态成员无关。
真正影响对象大小的只有:非静态数据成员、虚表指针、虚基表指针、内存对齐填充。
立即学习“C++免费学习笔记(深入)”;
静态成员的存在,只影响程序的全局数据段布局,不影响单个对象的字节长度。


















