首页 > 编程语言 >C/C++ sizeof 运算符注意事项

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

时间:2024-07-03 09:10:40浏览次数:6  
标签:字节 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

 

标签:字节,C++,运算符,大小,sizeof,指针
From: https://www.cnblogs.com/lucky-bubble/p/18280918

相关文章

  • Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换
    一、前言说明这个地图组件写了很多年了,最初设计的比较粗糙,最开始只是为了满足项目需要,并没有考虑太多拓展性,比如最初都是按照百度地图写死在代码中,经过这几年大量的现场实际应用,以及大量的用户提出的改进意见,逐渐萌生了彻底重新编写对应地图相关的代码,比如基类子类的设计,各种功能......
  • C++ STL 优先队列 (priority_queue)
    std::priority_queue<queue>优先队列  1、第一个元素始终为最大元素。  2、有着类似于堆的特性,它可以在其中随时插入元素。  3、支持下标访问(随机访问迭代器)优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问迭代器访问,并需要支持以下操作empty()si......
  • 【C++ | 继承】|概念、方式、特性、作用域、6类默认函数
    继承1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容派生类的创建和销毁构造函数拷贝构造赋值重载1.继承的概念与定义继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件......
  • C++字体库开发
    建议根据字体需求,多个组合使用。高度定制可基于freeType+harfbuzz基础库完成。GitHub-GNOME/pango:Read-onlymirrorofhttps://gitlab.gnome.org/GNOME/pangoGitHub-googlefonts/fontview:Demoappthatdisplaysfontswithafree/libre/open-sourcetextrenderi......
  • Python 语法 - 海象运算符:=
    前言海象运算符的英文原名叫AssignmentExpresions,即赋值表达式。是Python3.8新增的语法:=,在PEP572中提出。海象运算符之所以叫这个名字是因为这个符号就像是一个海象逆时针90°倒过来一样,符号为一个冒号接着一个等号,是:=这样的。用于条件表达式海象运算符由一个:......
  • 车站选票代码分析与展示(C++版)
    目录程序的主要功能1.主窗口:2.管理员窗口:3.普通顾客窗口:主要数据结构函数间调用关系算法流程图1.查询算法流程图​编辑2.乘客买票算法流程图程序运行结果1.主窗口->管理员窗口a.管理员窗口->验证窗口b.管理员增加车次信息c.浏览全部车辆信息d.注销车次信息e.车......
  • Linux—— 逻辑运算符,压缩和解压缩
     --a:and逻辑与  --o:or逻辑或  --not:not逻辑非  -优先级:与>或>非```shell[root@server~]#find / -size +10k -a -size -50k[root@server~]#find /etc  -name "e*" -o -name "f*"[root@server~]#find /etc  -nam......
  • C++基础(二):C++入门(二)
        上一篇博客我们正式进入C++的学习,这一篇博客我们继续学习C++入门的基础内容,一定要学好入门阶段的内容,这是后续学习C++的基础,方便我们后续更加容易的理解C++。目录一、内联函数1.0产生的原因1.1概念1.2特性1.3面试题二、缺省参数2.1缺省参数的概念2.2......
  • C++与C#创建位图,是否需要区分RGB和BGR模式
    在处理位图时,确实需要区分RGB和BGR模式,因为不同的库和API对颜色通道的排序有不同的约定。具体到C++与C#,这一点也是需要注意的。C++创建位图使用GDI+或WIC(WindowsImagingComponent):当你在C++中使用这些WindowsAPI创建或操作位图时,通常会指定像素格式,比如PixelFormat2......
  • C++定义函数指针,回调C#
    C++定义函数指针。typedefint(__stdcall*delegate_func)(inta,intb);暴露接口:int__stdcallCPPcallCSharp(delegate_funcfunc);方法实现:int__stdcallCPPcallCSharp(delegate_funcfunc){returnfunc(1,2);}头文件calculator.h#ifndefLIB_CALCULATOR_H#defin......