贝利信息

c++中如何获取变量的字节数_c++ sizeof运算符用法与注意事项【详解】

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

sizeof 不是函数,是编译期运算符,它返回的是类型或对象在当前平台的**静态字节数**,不能用于获取运行时动态分配内存的大小(比如 new 出来的数组长度)。

sizeof 作用于类型和变量的区别

语法上可以写 sizeof(int)sizeof xx 是变量),但语义一致:都是取该类型定义下的大小。注意括号在类型名时不可省略,变量名可省略。

数组名传参后 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); }

结构体/类的 sizeof 受内存对齐影响

sizeof 对结构体返回的是“满足对齐要求

后的总占用空间”,通常大于各成员大小之和。

struct S {
    char a;   // offset 0
    int b;    // offset 4(跳过 3 字节对齐到 4)
    char c;   // offset 8
}; // sizeof(S) == 12,不是 1+4+1 == 6

真正容易出错的地方,往往不在怎么写 sizeof,而在于误以为它能反映运行时数据长度,或忽略对齐导致跨平台序列化失败——这两个点,比记住语法重要得多。