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

你必须知道的C语言问题(9)

问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同?

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>typedef struct _test1{uint8_t a;uint32_t b;uint8_t c;
}test1_t;typedef struct _test2{uint8_t a;uint8_t c;uint32_t b;
}test2_t;int main(int argc, char* argv[])
{printf("sizeof(test1_t): %ld\r\nsizeof(test2_t): %ld\r\n", sizeof(test1_t), sizeof(test2_t));return 0;
}

运行输出:

sizeof(test1_t): 12
sizeof(test2_t): 8

答:变量默认遵循如下对齐规则:一字节的变量不做要求,两字节的变量至少要两字节对齐,四字节变量至少是四字节对齐。什么是字节对齐呢?以四字节对齐为例,就是变量的首地址要是4的倍数。结构体成员变量也要遵守如上的对齐规则,此外结构体的首地址要按最大成员变量对齐,结构体的大小必须是最大成员变量的整数倍。

test1_t类型的结构体它的最大成员变量b是4字节,该结构体一定是4字节对齐的,也就是第一个成员变量a是4字节对齐,第二个变量b也必须是4字节对齐,a和b之间会有3个字节的空隙,c大小是1字节,紧跟在b之后即可,但是test1_t的大小一定是4的倍数,所以c的后面也会有3字节的空隙。总的大小是12字节。

同样的方法分析test2_t类型的结构体,a占1字节,b占1字节,b和c之间有2字节的空隙,c占4字节,总大小8字节。

问:这样结构体成员之间会有空隙浪费空间,有没有办法让各成员紧密排列不留空隙?

答:可用__attribute__((packed))指定结构体成员之间紧密排列,而不按默认对齐方式预留空隙。代码如下:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>typedef struct _test1{uint8_t a;uint32_t b;uint8_t c;
} __attribute__((packed)) test1_t ;typedef struct  _test2{uint8_t a;uint8_t c;uint32_t b;
}__attribute__((packed)) test2_t;int main(int argc, char* argv[])
{printf("sizeof(test1_t): %ld\r\nsizeof(test2_t): %ld\r\n", sizeof(test1_t), sizeof(test2_t));return 0;
}

运行输出:

sizeof(test1_t): 6
sizeof(test2_t): 6

http://www.lryc.cn/news/438756.html

相关文章:

  • 如何通过网络找到自己想要的LabVIEW知识?
  • SCRM电商管理后台Axure高保真原型 源文件
  • 重载new,delete , RTTI,类成员指针
  • 基于SSM+Vue+MySQL的在线医疗服务系统
  • Windows 11上pip报‘TLS/SSL connection has been closed (EOF) (_ssl.c:1135)‘的解决方法
  • 53 - I. 在排序数组中查找数字 I
  • 基于 TDMQ for Apache Pulsar 的跨地域复制实践
  • 无线通信感知/雷达系统算法专业技术栈
  • 离谱碾压!奇安信中标:高出第二名近70分!
  • HOT 100(七)栈、堆、贪心算法
  • 速盾:高防服务器租用需要注意什么事项
  • 【数据库】MySQL内置函数
  • Promise查漏及回调地狱结构优化
  • SpringCloud-05 Resilience4J 服务降级和熔断
  • 哈希表、算法
  • 变更AWS EC2 实例配置或实例类型
  • 【前端】ref引用的作用
  • 运用Java实现倒计时功能
  • Vue 第三方调用若依系统实现系统单点登录
  • IP纯净度对跨境电商有哪些影响
  • docker-01 创建一个自己的镜像并运行容器
  • 国产视频转换HDMI1.4转单/双MIPI DSI/CSI LT6911C芯片方案,带音频输出,QFN64封装 Lontium
  • 亚马逊、沃尔玛、敦煌网、Target塔吉特、Temu环境搭建测评技术!
  • yjs05——matplotlib画其他图像
  • 【C#】添加临时环境变量
  • 物联网之ESP32与微信小程序实现指示灯、转向灯
  • ICPC网络赛 以及ACM训练总结
  • 优化深度学习模型训练过程:提升PASCAL VOC 2012数据集上Deeplabv3+模型训练效率的策略
  • 【乐吾乐大屏可视化组态编辑器】使用手册
  • uniapp+若依 开发租房小程序源码分享