当前位置: 首页 > news >正文

sizeof 核心原理:编译期的 “内存大小计算器”

sizeof 是 C 语言的编译期运算符(非函数),核心作用是计算「数据类型或变量」的固有内存大小,结果在编译时就已确定,与运行期逻辑无关。

一、核心原理拆解

  1. 计算时机:编译期完成,不执行表达式
    • sizeof 不会运行括号内的表达式,仅通过表达式的 “类型” 推导大小。
    • 示例:int a=5; sizeof(a++); 中,a++ 不会执行(a 仍为 5),仅计算 int 类型大小(4 字节)。
  1. 计算对象:只关注 “固有类型”,不关心 “实际存储内容”
    • 对变量:等价于 sizeof(变量的类型)(如 sizeof(c) 等价于 sizeof(int*),c 是 int* 指针)。
    • 对类型:直接返回该类型的标准内存大小(如 sizeof(int)=4、sizeof(double)=8)。
  1. 大小规则:由类型和系统位数决定,与运行期状态无关
    • 基础类型(int、char 等):大小是语言标准或编译器规定的固定值(如 char 恒为 1 字节)。
    • 指针类型(任意 T*):大小由系统位数决定(64 位 = 8 字节,32 位 = 4 字节),与指向的类型无关。
    • 复合类型(数组、结构体):数组 sizeof(arr) = 元素个数 × 元素类型大小;结构体需考虑内存对齐(默认按最大成员类型对齐)。

二、关键误区

  • 为什么 sizeof(int* c) 是 8 字节?→ 因为 int* 是指针类型,64 位系统中所有指针类型的固有大小都是 8 字节。
  • 为什么 sizeof(c[3]) 是 4 字节?→ 因为 c[3] 的类型是 int,int 的固有大小是 4 字节,下标不改变类型。
  • 为什么 sizeof 拿不到堆内存大小?→ 堆内存是运行期 malloc 动态分配的,sizeof 编译时无法获取运行期的动态信息,只能计算指针本身的固有大小。
http://www.gsyq.cn/news/117751.html

相关文章:

  • [后端进阶] 详解分布式锁的三种实现方式:MySQL vs Redis vs ZooKeeper
  • 定性与定量考核的结合
  • [表单]HTML Learn Data Day 1
  • KP32511SGA固定12V输出小家电电源芯片 典型应用电路
  • 基于PowerShell的Windows服务命令行管理器(WSM)
  • 使用格子玻尔兹曼方法(LBM)模拟热扩散的Matlab代码
  • IPv6违规外联防御指南:从风险盲区到可管可控
  • 高效测试脚本维护:策略与实战技巧
  • BioSIM抗人TGFB1抗体SIM0367:适用广泛,功能多样
  • 机器视觉介绍
  • GA-LSSVM多输入多输出回归,基于遗传算法(GA)优化最小二乘向量机(LSSVM)的多输入...
  • LangChain多智能体协作实战教程(超详细)从基础架构到动态循环机制,一篇搞定,值得收藏!
  • 算法驱动搜索变革:亚马逊新规则,卖家如何赢下曝光争夺战?
  • BioSIM 抗人GARP/TGF-β1复合抗体SIM0368:高特异性、高灵敏度以及广泛的适用性
  • 完整教程:openEuler 22.03 LTS 部署 ELK(Elasticsearch+Logstash+Kibana)完整教程
  • 每天一个大模型相关知识点系列--Lora微调
  • 汇总12款Word生成PPT工具,哪款更适合日常汇报?
  • 深入解析:AI Agent设计模式 Day 13:Ensemble模式:集成多个Agent的智慧
  • 从零开始:C#回收魔法—深入浅出揭开Dispose与释放模式的神秘面纱
  • 【TVM 教程】Python 目标参数化
  • Oracle性能诊断与SQL优化:从9i到19c的技术演进与实践
  • FT8440B输出12V350MA,18V300MA 非隔离电源方案 典型应用电路
  • SpringBoot使用设计模式一观察者模式
  • PHOTO1111
  • 基于大数据的社交网络隐私保护及舆情分析可视化系统课题申报表
  • CUDA初始团队成员锐评cuTile「专打」Triton,Tile范式能否重塑GPU编程生态竞争格局
  • 大模型面试必备03——llama文章精读
  • TikTok多账号风控:找对安全支点,解锁规模化运营
  • 基于大数据的热点话题分析系统的设计与实现中期
  • 【往届已检索、ACM出版、见刊检索稳定】第二届数字管理与信息技术国际学术会议 (DMIT 2026)