普通成员函数不增加对象大小,因其代码存于代码段且调用时仅隐式传递this指针;真正影响sizeof的是vptr、vbptr、空类占位、对齐填充等编译器插入的隐藏内容。

不会。 普通成员函数(非虚、非静态)完全不增加 sizeof 结果,哪怕你加一百个 void foo() {},对象大小也不会变。
为什么普通成员函数不占对象空间
编译器把所有成员函数统一放在代码段(.text),和全局函数一样处理;调用时只是隐式传入 this 指针,不往对象里塞任何东西。你可以把它理解成:函数代码是“共享的”,对象只存自己的数据。
常见错误现象:
- 误以为
class A { void f(); int x; };的sizeof(A)是sizeof(int) + sizeof(f)—— 实际上没有sizeof(f)这回事 - 在调试器里看到对象内存布局,发现只有成员变量字段,找不到函数相关字段
哪些情况会让对象变大
真正影响 sizeof 的,是编译器悄悄加进去的隐藏成员,不是你写的函数:
- 有虚函数 → 加一个
vptr(通常 8 字节,64 位系统) - 虚继承 → 可能额外加一个
vbptr(虚基表指针) - 空类 → 强制设为 1 字节(保证每个对象有唯一地址)
- 成员变量对齐 padding → 比如
char a; int b;往往占 8 字节而非 5
注意:static 成员函数和 static 成员变量也都不计入对象大小,它们属于类作用域,存在全局/静态区。
虚函数是个特例:它本身不占空间,但触发 vptr 插入
写一个虚函数,比如 virtual void draw();,函数体本身仍不进对象;但编译器必须给每个对象塞一个指向虚函数表的指针。这个指针才是“多出来的字节”。
关键细节:
- 无论类里定义 1 个还是 10 个虚函数,
vptr只有一个 - 多重继承下,如果多个基类都有虚函数,子类对象可能含多个
vptr(取决于 ABI 和继承关系) - 虚函数表(vtable)是类级别的,不是对象级别的——所有同类型对象共享同一张表
最容易被忽略的是:对象大小由内存布局规则(对齐 + 隐藏指针 + padding)决定,而不是你“写了什么”,而是“编译器认为需要放什么”。哪怕你删掉所有显式成员,只要留一个 virtual,sizeof 就会跳到指针宽度。这背后不是语法问题,是 C++ 对象模型在起作用。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











