柔性数组理解

简介: 柔性数组理解

柔性概念


零长度数组(Arrays of Length Zero)也叫做可变数组/柔性数组。 在c99中,对于结构体中的最后一个成员,可以允许最后一个成员是未知大小的数组,这样的数组就叫做柔性数组。


定义


struct udppkt {
    struct ethhdr et;
    struct iphdr ip;
    struct udphdr udp;
    unsigned char data[0];//定义零长数组或柔性数组,1.不需要具体的长度。2.不考虑越界
}
或者
struct udppkt {
    struct ethhdr et;
    struct iphdr ip;
    struct udphdr udp;
    unsigned char data[];//定义零长数组或柔性数组,1.不需要具体的长度。2.不考虑越界
}


特点


特点: 1> 定义的结构体中的柔性数组成员前面必须至少含有一个别的类型的成员;一般柔性数组放到结构体最后;

2>结构体长度,sizeof返回的结构体的大小不包含柔性数组的大小;柔性数组长度为0;

3>包含柔性数组成员的结构体的大小用malloc函数动态分配内存,并且分配的内存大小应该大于结构体的大小,以适应柔性数组的预期大小。

4> 对于长度为0数组, 在申请内存空间时, 采用一次性分配的原则进行;


用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体


用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个结构体是可变长的. 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量。


性能


第一个好处是:方便内存释放

如果我们的代码是在一个给别人用的函数中,你在函数中做了两次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存

也给释放掉。

第二个好处是:有利于访问速度.

连续的内存有益于提高访问速度,也有益于减少内存碎片。


参考


C语言0长度数组(可变数组/柔性数组)详解

柔性数组的使用

目录
相关文章
|
SQL 分布式计算 数据可视化
Tableau与大数据:可视化工具在大数据分析中的应用
【4月更文挑战第8天】Tableau是一款领先的数据可视化工具,擅长于大数据分析,提供广泛的数据连接器,支持多源整合。它与Hadoop、Spark等深度集成,实现高效大数据处理。Tableau的拖拽式界面和交互式分析功能使得非技术人员也能轻松探索数据。在实战中,Tableau用于业务监控、数据storytelling和自助式分析,推动数据民主化,提升决策效率。未来,Tableau将持续创新,扩展生态系统,并保障数据安全与合规性,助力企业最大化数据价值。
844 0
|
数据采集 监控 数据管理
《阿里云数据治理方案及案例分享》|学习笔记
快速学习《阿里云数据治理方案及案例分享》
2411 0
|
编解码 Android开发
常用adb命令
常用adb命令
347 2
|
12月前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
939 30
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
Prometheus Cloud Native 调度
Sentinel 新版本发布,提升配置灵活性以及可观测配套
Sentinel 新版本发布,提升配置灵活性以及可观测配套
1401 99
|
SQL 测试技术 Python
SqlAlchemy 2.0 中文文档(四十三)(6)
SqlAlchemy 2.0 中文文档(四十三)
149 0
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。
264 0
|
存储 安全 编译器
跟着iLogtail学习无锁化编程
锁是解决这些问题的传统方法,而无锁化编程是一种更高级但复杂的技术,它能够在某些情况下提供更优的性能和可扩展性。正确选择和实现适合应用场景的并发策略,是高效多线程编程的关键。本文由作者带着大家一起学习无锁化编程。
|
前端开发 小程序 编译器
前端开发新电脑配置(菜菜最为 详细的配置)
前端开发新电脑配置(菜菜最为 详细的配置)
|
存储 缓存 Apache
Apache Doris 巨大飞跃:存算分离新架构
Apache Doris 巨大飞跃:全新的存算分离架构正式推出,SeiectDB 未来将贡献至 Apache Doris 社区
1949 4
Apache Doris 巨大飞跃:存算分离新架构