首页 > 其他分享 >c zero length array 零长度数组

c zero length array 零长度数组

时间:2023-12-26 16:49:23浏览次数:32  
标签:struct zero length 数组 长度 line array contents

struct userdata
{
    uint32_t len;
    uint8_t data[0];
};

在阅读一些开源代码时,比如linux kernel,会发现上面这种用法,这种叫做零长度数组。有什么作用呢?简单来说为了开发便利,顺便节省空间。

使用限制

只能放在结构体结尾,也就是一个结构体只能有一个零长度数组。

使用场景

比如我们有一个变长的数据块,如何保存这部分数据,有两种方案。

固定长度数组

struct userdata
{
    uint32_t len;
    uint8_t data[128];
};

可以定义一个最大长度的数组,每次把数据放到该数组中。有两个缺点

  • 数据固定,如果超过最大值,会报错,需要重新修改代码编译。
  • 浪费空间,正常情况都不会存满,导致内存浪费。

同样这种方式也有优点

  • 更好的性能。用空间换时间,数据是提前分配好的,避免了申请时的再次分配。

指针形式

struct userdata
{
    uint32_t len;
    uint8_t * data;
};

这样在使用时现malloc申请空间,再赋值给data,缺点

  • 多了一个指针,增加了空间占用

优点

  • 灵活,可以放在任何位置,可以有多个

零长度数组

struct line {
  int length;
  char contents[0];
};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

借用官方的示例说明以下,申请了一块空间,多出来的就是contents的内容。优点

  • contents不占用空间,struct line的大小就是int length的大小。contents只是一个符号
  • 数组空间不仅是动态的,还是连续的,更好的性能。使用指针,申请的空间与当前结构体不是连续的。

缺点

  • 不够灵活,只能放在最后

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

标签:struct,zero,length,数组,长度,line,array,contents
From: https://www.cnblogs.com/studywithallofyou/p/17928439.html

相关文章

  • Arrays.asList方法返回对象
    上例子int[]arr={1,2,3};Listlist=Arrays.asList(arr);for(Objectobject:list){System.out.println(object);}可以看到输出的其实是一个对象,并不是1,2,3解决方法Integer[]arr={1,2,3};......
  • 无涯教程-PostgreSQL - ARRAY函数
    PostgreSQLARRAY_AGG函数用于将包含null的输入值连接到数组中。要了解ARRAY_AGG函数,请考虑将 COMPANY 记录为跟随-testdb#select*fromCOMPANY;id|name|age|address|salary----+-------+-----+-----------+--------1|Paul|32|California|......
  • CF1917 C Watering an Array
    Link首先我们研究全是0的情况,显然的,每次操作2最多可以得到1分。那么显然的,不如直接一次操作一一次操作二,这样是最优的。然后再研究初始数组,很难用很快的方式得到应该从什么时候开始第一次操作二。不过可以注意到,第一次操作2最多可以得到n分,那么我们再\(2n+1\)天以后进行第一次......
  • collection List ArrayList HashSet
    1)collection实现子类可以存放多个元素,每个元素可以是Obiect2)有些Collection的实现类,可以存放重复的元素,有些不可以3)有些Collection的实现类,有些是有序的(List),有些不是有序(Set)4)Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的List接口基本介绍List接......
  • Hzero教程:初始化数据库及同步表结构(基于liquibase + groovy)
    初始化数据库更新时间:2023-12-0115:38:30介绍项目创建成功之后,需要初始化本地数据库。在开发之前,请确保本地项目已经创建成功,详见创建项目创建用户确保数据库启动成功,并创建项目访问的用户。CREATEUSER'hzero'@'%'IDENTIFIEDBY"hzero";创建数据库用户创建成功之后,创建项目对......
  • Hzero教程:创建基于hzero的springboot单体maven项目完整步骤
    创建项目更新时间:2023-12-0115:38:30介绍项目是基于Springboot的maven项目,本章节介绍怎样创建基于HZERO平台的项目。新建maven项目添加项目依赖添加默认配置文件创建maven项目本地新建一个空的maven项目hzero-todo-service。$mkdir-phzero-todo-service$cdhzero-tod......
  • 人工智能大模型原理与应用实战:从OpenAI Five到MuZero
    1.背景介绍人工智能(AI)是计算机科学的一个分支,研究如何使计算机能够像人类一样进行智能操作。AI的目标是让计算机能够理解自然语言、进行逻辑推理、学习自主决策、进行视觉识别、进行语音识别等等。AI的主要技术有机器学习、深度学习、神经网络、自然语言处理、计算机视觉、机器人等......
  • linux内核中的zero-page
    zero-page操作系统给用户新分配的内容(通过mmap或者brk)都是清零过的,但是这些虚拟地址通常都是按需分配物理页面。这里的“按需”的需求可能是读取,也可能是写入。如果只是读取,只要保证读取内容是零即可,在MMU的基础上,可以让“所有”虚拟地址都映射到内容为0的物理页面中。这样如......
  • 谈谈JS二进制:File、Blob、FileReader、ArrayBuffer、Base64
    JavaScript提供了一些API来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64等。下面就来看看它们都是如何使用的,它们之间又有何区别和联系!1.BlobBlob全称为binarylargeobject,即二进制大对象,它是JavaScript中的一个对象,表示原始的类似文件......
  • cpp-Array-element-count
    title:C++数组元素个数计算author:TokisakiGalaxytop:falsecover:falsetoc:truemathjax:falsedate:2019-12-03img:coverImg:excerpt:C++数组元素个数计算tags:-C++categories:-编程password:inti_max(inta[]){ inttmp=a[0]; for(inti=......