sizeof是编译期运算符,返回类型或对象的静态字节数;不能用于动态内存;作用于类型需括号,变量可省略;数组名传参后退化为指针,sizeof失效。

sizeof 不是函数,是编译期运算符,它返回的是类型或对象在当前平台的**静态字节数**,不能用于获取运行时动态分配内存的大小(比如 new 出来的数组长度)。
sizeof 作用于类型和变量的区别
语法上可以写 sizeof(int) 或 sizeof x(x 是变量),但语义一致:都是取该类型定义下的大小。注意括号在类型名时不可省略,变量名可省略。
-
sizeof(int)合法;sizeof int非法(缺少括号) -
sizeof arr和sizeof(arr)等价,但arr必须是数组名(非指针) - 对指针变量用
sizeof,得到的是指针本身的大小(通常是 4 或 8 字节),不是它指向内容的大小
数组名传参后 sizeof 失效的典型陷阱
函数参数中的数组会退化为指针,此时 sizeof 返回指针大小,而非原始数组字节数。
void func(int arr[10]) {
// 这里 arr 已是 int* 类型
std::cout << sizeof(arr) << "\n"; // 输出 8(64 位系统下指针大小),不是 40
}
int main() {
int a[10] = {};
std::cout << sizeof(a) << "\n"; // 输出 40
func(a);
}
- 若需在函数内知道数组长度,必须额外传入
size_t len参数 - 或改用
std::array/std::vector,它们自带.size() - C++20 起可用模板推导:
template,此时void func(int (&arr)[N]) sizeof(arr)有效
结构体/类的 sizeof 受内存对齐影响
sizeof 对结构体返回的是“满足对齐要求后的总占用空间”,通常大于各成员大小之和。
立即学习“C++免费学习笔记(深入)”;
struct S {
char a; // offset 0
int b; // offset 4(跳过 3 字节对齐到 4)
char c; // offset 8
}; // sizeof(S) == 12,不是 1+4+1 == 6- 对齐规则由编译器和目标平台决定,可通过
#pragma pack(n)或alignas修改 -
sizeof结果是编译期常量,可用于栈数组声明:char buf[sizeof(S)]; - 虚函数表指针(vptr)会增加类对象大小,但空基类可能被优化(EBO)
真正容易出错的地方,往往不在怎么写 sizeof,而在于误以为它能反映运行时数据长度,或忽略对齐导致跨平台序列化失败——这两个点,比记住语法重要得多。










