圣乌 2023-03-01 20:55 采纳率: 57.1%
浏览 15
已结题

为什么这里显示的是12而不是9?

img


为什么这里显示的是12而不是9?
按理来说int字节是4 float是4 char是1
那总字节应该是9啊,为什么会是12

  • 写回答

2条回答 默认 最新

  • 编程漫步者 2023-03-01 22:07
    关注

    这是由于内存对齐(memory alignment)所导致的。内存对齐是计算机体系结构中的一个概念,它指的是将变量存储在内存中时,按照特定的规则来分配内存空间。这样可以提高内存读写的效率,同时也保证了程序的可移植性和兼容性。

    在这个例子中,当结构体中的变量按照其定义顺序依次排列时,编译器会在变量之间插入一些填充字节,使得变量的地址符合特定的对齐规则(比如说,32位架构通常要求变量在内存中的地址是4的倍数)。因此,实际占用的内存空间是变量大小的整数倍。

    在这个结构体中,int占用了4个字节,float占用了4个字节,char占用了1个字节。由于int和float的大小都是4字节,它们可以在同一个对齐单元中排列,因此它们之间不需要填充字节。但是,由于char的大小是1字节,它需要在单独的对齐单元中排列。因此,编译器在结构体中添加了3个填充字节,使得char的地址符合对齐规则。因此,结构体s的大小为12个字节。

    如果你希望尽量减小内存占用,可以使用 #pragma pack 指令来控制内存对齐的规则。比如,可以使用 #pragma pack(1) 来关闭内存对齐,这样就可以使结构体的大小为9个字节。但是需要注意的是,关闭内存对齐可能会降低程序的运行效率,因为这样会增加内存读写的次数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算