sizeof是编译期运算符,返回类型或对象的静态字节数;不能用于动态内存;作用于类型需括号,变量可省略;数组名传参后退化为指针,sizeof失效。
sizeof 不是函数,是编译期运算符,它返回的是类型或对象在当前平台的**静态字节数**,不能用于获取运行时动态分配内存的大小(比如 new 出来的数组长度)。
语法上可以写 sizeof(int) 或 sizeof x(x 是变量),但语义一致:都是取该类型定义下的大小。注意括号在类型名时不可省略,变量名可省略。
sizeof(int) 合法;sizeof int 非法(缺少括号)sizeof arr 和 sizeof(arr) 等价,但 arr 必须是数组名(非指针)sizeof,得到的是指针本身的大小(通常是 4 或 8 字节),不是它指向内容的大小函数参数中的数组会退化为指针,此时 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()
template void func(int (&arr)[N]) ,此时 sizeof(arr) 有效sizeof 对结构体返回的是“满足对齐要求后的总占用空间”,通常大于各成员大小之和。
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)];
真正容易出错的地方,往往不在怎么写 sizeof,而在于误以为它能反映运行时数据长度,或忽略对齐导致跨平台序列化失败——这两个点,比记住语法重要得多。