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 <p>注意:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img
src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a>
<p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
-
static int y必须在类外定义(int A::y = 0;),否则链接失败; - 即使你删掉这行定义,
sizeof(A)还是 4 —— 编译期就确定了,不依赖链接是否存在该符号; - 如果类里有虚函数,
sizeof会多出一个虚表指针(通常 8 字节),但这和静态成员无关。
真正影响对象大小的只有:非静态数据成员、虚表指针、虚基表指针、内存对齐填充。
静态成员的存在,只影响程序的全局数据段布局,不影响单个对象的字节长度。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










