sizeof是编译期运算符,返回size_t类型的字节数;对变量用sizeof(x),对类型用sizeof(Type);数组名得sizeof(arr)得总大小,指针或动态内存只得指针大小;结构体因对齐可能大于成员和;跨平台应使用<cstdint>定宽类型并static_assert校验。

用 sizeof 直接查变量或类型的字节数
sizeof 是编译期运算符,不是函数,它返回的是 size_t 类型的常量值,代表对象或类型在当前平台上的字节大小。对变量直接用 sizeof(var),对类型用 sizeof(Type)(括号不能省)。
常见误操作是写成 sizeof var(无括号),这在变量名不带括号时虽能编译(如 sizeof x),但极易出错——一旦变量名含空格、运算符或模板实例化,就语法错误。统一加括号最安全。
-
int x = 42;→sizeof(x)返回4(x86_64 Linux/macOS 下) -
sizeof(int)和sizeof(x)结果相同,但语义不同:前者查类型,后者查具体对象 - 对数组名使用
sizeof(arr)返回整个数组字节数,不是指针大小;而传入函数后退化为指针,sizeof就只返回指针大小(通常是 8)
注意结构体/类的字节对齐影响结果
结构体的 sizeof 不等于各成员 sizeof 之和,编译器会按默认对齐规则插入填充字节。比如 struct { char a; int b; } 在大多数 64 位系统上是 8 字节,而非 5 字节。
对齐方式受编译器、目标架构和编译选项(如 -m32 / -m64)影响,也受 #pragma pack 或 alignas 干扰。调试时若发现结构体大小“不合理”,优先检查成员顺序和对齐约束。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 成员按地址升序排列,把小类型(如
char)集中放前面,可能减少填充 -
static_assert(sizeof(MyStruct) == 16, "unexpected size");可用于 CI 中防止意外变更 -
offsetof(MyStruct, member)配合sizeof能定位每个成员的偏移和占用范围
动态分配内存的对象不能靠 sizeof 查实际大小
sizeof 对指针(包括 new 出来的)只返回指针本身大小(通常 8 字节),不是它指向的内存块大小。C++ 没有标准机制从指针反推 malloc 或 new 分配了多少字节。
如果真需要运行时知道堆上某块内存大小,得自己记:要么用封装类(如自定义 AllocatedBuffer 存储 size 字段),要么依赖平台 API(如 Linux 的 malloc_usable_size(),但它是非标准且不保证准确)。
-
int* p = new int[100]; sizeof(p)→ 永远是8(64 位系统) -
std::vector<int> v(100); sizeof(v)</int>返回 vector 对象自身大小(约 24 字节),不是元素总大小;要用v.size() * sizeof(int) - 不要试图对
void*或任意指针做sizeof(*p)来“猜”所指类型大小——类型信息已丢失,行为未定义
跨平台开发时别硬编码字节数
虽然 sizeof(int) 在多数现代系统是 4,但 C++ 标准只要求 int 至少 16 位;long 在 Windows x64 是 4 字节,在 Linux x64 是 8 字节。依赖固定大小容易引发移植问题。
真正需要确定宽度的场景(如网络协议、文件格式),应改用 <cstdint> 中的定宽类型:int32_t、uint8_t 等,并用 static_assert 校验:
static_assert(sizeof(int32_t) == 4, "int32_t must be exactly 4 bytes");
另外,sizeof 结果是 size_t,打印时必须用 %zu(C)或 std::cout << sizeof(x)(C++),用 %d 或 %lu 会导致格式错误甚至崩溃。

















