C/C++ sizeof 运算符注意事项

sizeof 运算符在 C/C++ 中用于获取变量或类型所占的内存大小(以字节为单位)。尽管 sizeof 是一个相对简单直接的运算符,但在使用时还是需要注意一些细节和特殊情况,以避免误解或错误。

以下是一些使用 sizeof 运算符时需要注意的事项:

  1. 数据类型大小sizeof 返回的是变量或类型在编译时所占的内存大小,而不是其在运行时可能占用的动态内存大小。例如,指针的大小与其指向的内存大小无关,只与平台有关。

  2. 数组:当 sizeof 用于数组时,返回的是整个数组所占的内存大小,等于数组元素个数乘以单个元素的大小。

  3. 结构体和联合体:对于结构体和联合体,sizeof 返回的是整个结构体或联合体的大小,包括任何内部填充(padding)字节。填充字节是为了满足内存对齐要求而插入的,并不直接对应于任何成员变量。

  4. 指针:所有指针类型的大小都是相同的,并且与平台有关。例如,在 32 位系统上,所有指针的大小都是 4 字节;在 64 位系统上,所有指针的大小都是 8 字节。

  5. 函数:在 C/C++ 中,不能对函数使用 sizeof 运算符。如果尝试这样做,编译器会报错。

  6. 字符串:当 sizeof 用于字符串字面量时,返回的是包括末尾空字符('\0')在内的整个字符串字面量的大小。

  7. 类型别名:使用 sizeof 时,如果操作数是一个类型别名,那么它返回的是该别名所代表的类型的大小。

  8. 动态分配的内存sizeof 不能用于获取动态分配(例如,通过 malloc 或 new)的内存块的大小。它只能用于静态分配的内存(如数组、结构体等)。

  9. 位字段:如果结构体包含位字段,sizeof 返回的结构体大小可能会因为内存对齐而大于所有位字段大小的总和。

  10. C++ 中的类:对于类,sizeof 返回的是类实例的大小,包括所有非静态成员变量的大小以及任何由于内存对齐而添加的填充字节。静态成员变量不计入类实例的大小中。

理解这些注意事项可以帮助你更准确地使用 sizeof 运算符,并避免一些常见的误解和错误。

更进一步地,可参见如下详细介绍:

  1. sizeof 不应作用于数组参数
  2. sizeof 不应作用于比较或逻辑表达式
  3. sizeof 作用于指针是可疑的
  4. 被除数不应是作用于指针的 sizeof 表达式
  5. 指针加减偏移量时计入 sizeof 是可疑的
  6. sizeof 表达式的结果不应与 0 或负数比较
  7. sizeof 不应再作用于 sizeof 表达式
  8. C++ 代码中 sizeof 不应作用于 NULL
  9. sizeof 不可作用于 void

 

posted @ 2024-07-03 09:01  幸运泡泡  阅读(3)  评论(0编辑  收藏  举报