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

12次阅读

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

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

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

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

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

  • sizeof(int) 合法;sizeof int 非法(缺少括号)
  • sizeof arrsizeof(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,而在于误以为它能反映运行时数据长度,或忽略对齐导致跨平台序列化失败——这两个点,比记住语法重要得多。

text=ZqhQzanResources