C语言中用sizeof求struct大小的注意事项

devtools/2025/2/21 18:32:10/

在C语言中, sizeof 是一个非常实用的操作符,用于计算数据类型或变量在内存中所占的字节数。当涉及到计算结构体( struct )大小时,情况会变得稍微复杂一些,因为这里存在内存对齐的概念。本文将深入探讨使用 sizeof 求 struct 大小的注意事项。

 

内存对齐原则

 

数据成员对齐规则:结构体的每个数据成员都有自己的对齐要求。例如, char 类型通常占用1个字节,其对齐要求是1字节; int 类型通常占用4个字节,其对齐要求是4字节(在32位系统下)。编译器会在数据成员之间插入填充字节(padding),以确保每个数据成员都位于其对齐边界上。

 

结构体整体对齐规则:结构体本身也有一个对齐要求,通常是其最大数据成员对齐要求的倍数。例如,如果一个结构体中最大的数据成员是 double (8字节对齐),那么整个结构体的对齐要求就是8字节。

 

示例分析

 

 

示例1分析

-  char a :占用1字节,在内存中的起始地址是0。

 

-  int b :对齐要求是4字节,因此编译器会在 a 后面填充3个字节,使 b 的起始地址为4(4是4的倍数), b 占用4字节(地址4 - 7)。

 

-  char c :占用1字节,在地址8处存储。

 

- 结构体整体对齐要求是4字节(因为 int 的对齐要求是4字节),所以结构体总大小为12字节(1 + 3 + 4 + 1 + 3),最后的3个字节是填充字节,以确保结构体整体大小是4的倍数。

 

示例2分析

-  char a :占用1字节,起始地址0。

 

-  char c :占用1字节,起始地址1。

 

-  int b :对齐要求4字节,因此在 c 后面填充2个字节,使 b 起始地址为4(4是4的倍数), b 占用4字节(地址4 - 7)。

 

- 结构体整体对齐要求是4字节,总大小为8字节(1 + 1 + 2 + 4)。

 

影响内存对齐的因素

 

编译器:不同的编译器可能有不同的默认对齐规则。例如,GCC和Visual C++的默认对齐方式可能略有不同。可以通过编译器特定的指令来改变对齐方式,如在GCC中可以使用 #pragma pack(n) 来指定对齐字节数 n 。

 

平台:不同的硬件平台对数据对齐有不同的要求。有些平台可能要求所有数据成员都对齐到特定的边界,否则会导致性能下降甚至硬件错误。

 

注意事项总结

结构体成员顺序影响大小:在定义结构体时,合理安排成员顺序可以减少内存占用。将占用字节数小的数据成员放在一起,占用字节数大的数据成员放在一起,有助于减少填充字节。

 

了解编译器和平台特性:编写跨平台代码时,要充分考虑不同编译器和平台的对齐规则差异,避免因内存对齐问题导致代码在不同环境下表现不一致。

 

避免不必要的填充:如果对内存使用非常敏感,可以通过调整结构体定义或使用编译器指令来减少填充字节,提高内存利用率。

 

在C语言中使用 sizeof 计算结构体大小时,内存对齐是一个关键因素。深入理解内存对齐的规则和影响因素,能够帮助我们编写出更高效、更健壮的代码。


http://www.ppmy.cn/devtools/160749.html

相关文章

日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”

日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”  1、前言(1)情况说明(2)工程师的信仰2、知识点(1)寒くなりました & 元気になりました(2)何(なに)になりたいですか。(…

[超详细]JAVA接入DeepSeek保姆级教学[小白]

目录 前言 1、获取自己在DeepSeek上的token 2、引入依赖 3、创建实体类 4、创建Controller层 5、启动项目、调用自己的接口 前言 对于目前的DeepSeek大家应该都不是很陌生,目前也是最流行的一款AI软件了,所以为了让我们开发更全面,能够…

java面试场景问题

还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…

使用Nginx本地部署Axure生成的HTML文件,局域网内浏览器通过IP和地址访问

在原型设计阶段,Axure是一款非常流行的工具,它能够帮助设计师快速创建交互原型。然而,有时候我们需要将这些原型分享给团队内的其他成员进行评审和测试。这时,通过Nginx将Axure生成的HTML文件部署到本地服务器,并在局域…

深入解析 VIE(Variable Interest Entity,可变利益实体)架构:中国公司如何在海外上市?

深入解析 VIE 架构:中国公司如何在海外上市? 在全球资本市场上,许多中国企业,尤其是科技、互联网和教育类公司,采用了一种特殊的法律架构在美国上市,即 VIE(Variable Interest Entity&#xff…

JAVA EE初阶 JVM

JVM Java是一个跨平台的语言,可以不加修改在任何操作系统中运行。 JVM运行流程 代码编译之后生成了什么文件? java文本文件 —> class字节码文件,最终会在JVM中执行。 class文件怎么被JVM加载并运行? JVM运行时数据区 J…

优选算法的灵动之章:双指针专题(一)

个人主页:手握风云 专栏:算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写(覆盖) 4.1虚函数 4.2三同 4.3两种特殊情况 (1)协变 (2)析构函数的重写 五、C11中的final和over…