当前位置: 首页 > 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.jsqmd.com/news/106679/

相关文章:

  • IPv6违规外联防御指南:从风险盲区到可管可控
  • 直接上手玩转遗传算法,先搞个简单的函数最值问题热热身。比如找f(x)=x²的最小值,这玩意儿小学生都能秒答,但咱们用遗传算法折腾一下。先看看种群初始化代码
  • GitLab讲解
  • 算法驱动搜索变革:亚马逊新规则,卖家如何赢下曝光争夺战?
  • 汇编语言全接触-33.RichEdit 控件基础知识
  • 【光照】[PBR][镜面反射]实现方法解析
  • 从“十五五”规划建议看智慧医疗重点发展方向
  • 汇编语言全接触-32.多文档界面(MDI)
  • [后端进阶] 详解分布式锁的三种实现方式:MySQL vs Redis vs ZooKeeper
  • 香港科技大学团队发明“智能管家“,让AI一眼就知道该抓哪里用哪里
  • 《ZeroTier教程》02-使用docker部署自建PLANET和controller 二次开发ztncui控制面板
  • 中国储能第一股赴美IPO,但工厂也得搬过去
  • 最长公共子序列(LCS)
  • 机器视觉介绍
  • KAIST突破:AI实现SVG矢量图形智能动画
  • Model Context Protocol(MCP)简介以及简单示例代码测试(.net8)
  • 非支配排序多目标鲸鱼优化算法(NSWOA) Matlab实现探索
  • 完整教程:openEuler 22.03 LTS 部署 ELK(Elasticsearch+Logstash+Kibana)完整教程
  • KP32511SGA固定12V输出小家电电源芯片 典型应用电路
  • [表单]HTML Learn Data Day 1
  • Wireshark官网中文版下载和安装教程(附安装包,图文版)
  • 基于PowerShell的Windows服务命令行管理器(WSM)
  • springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
  • 用长短期记忆网络融合注意力机制做时间序列预测,效果惊人
  • LP3799FBC_48W隔离电源芯片(12V4A)典型应用电路
  • 12.17学习例题(1)
  • 提示词工程完全指南(超详细)从零基础到精通,一篇就够,建议收藏!
  • GA-LSSVM多输入多输出回归,基于遗传算法(GA)优化最小二乘向量机(LSSVM)的多输入...
  • BioSIM 抗人GARP/TGF-β1复合抗体SIM0368:高特异性、高灵敏度以及广泛的适用性
  • 一款实用的Windows自动更新管理器--WAU 管理器,v3.8.3.0新版本,中文便携版~