sizeof(empty*)与任何其他对象指针相同,由平台架构决定:32位系统为4,64位系统为8;空类对象大小为1,但指针大小与其无关,仅取决于地址宽度。

sizeof 一个指向空类的指针,和指向任何其他类型的指针一样,只取决于平台架构,与目标类是否为空无关。
指针大小由系统决定,不是由所指类型决定
无论 int*、char* 还是 EmptyClass*,只要在同一编译环境下(如 x64 Windows 或 Linux),它们的 sizeof 结果都相同:
- 32 位系统下通常是
4 - 64 位系统下通常是
8
这是因为指针本质就是存储内存地址的整数,而地址宽度由 CPU 和 ABI 决定。空类本身大小是 1(编译器填充),但这不影响指针变量自身占多少字节。
验证:空类指针和普通指针大小一致
下面这段代码在主流编译器(GCC/Clang/MSVC)64 位环境下输出全是 8:
#include <iostream>
class Empty {};
int main() {
std::cout
<p>注意:<code>Empty*</code> 是类型,不是对象;<code>sizeof</code> 计算的是该指针类型变量本身的大小,不是它指向的对象大小。</p>
<h3>容易混淆的点:空类对象大小 ≠ 空类指针大小</h3>
<p>常见误解是把这两者混为一谈:</p>
<ul>
<li>
<code>sizeof(Empty)</code> → 返回 <code>1</code>(空类对象最小占 1 字节)</li>
<li>
<code>sizeof(Empty*)</code> → 返回 <code>8</code>(64 位下地址宽度)</li>
<li>
<code>sizeof(Empty**)</code> → 同样是 <code>8</code>(二级指针也是指针)</li>
</ul>
<p>虚函数会改变空类对象大小(加 vptr),但不会影响 <code>Empty*</code> 的大小 —— 因为指针类型不携带虚表信息,vptr 存在于对象实例内存中,而非指针里。</p>
<p>真正影响指针大小的,只有平台和指针种类:普通对象指针、函数指针、成员函数指针可能不同,但“指向空类的指针”属于最普通的对象指针范畴,没有特殊处理。</p></iostream>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











