c语言、c++扩展介绍 ————柔性数组、零长数组。

简介: 零长数组做为一种 GNU 的语法扩展方式,为数据处理提供优化支持。因为编译器的编译特性,这种声明方式,只是一个指向固定位置的偏移量常量,为什么要使用零长数组

注意: 一下所有的讨论都是基于结构体内部而言的,并不是单独拿出来的情境下的结论。


  1. 零长数组是什么?
  2. 零长数组做为一种 GNU 的语法扩展方式,为数据处理提供优化支持。
  3. 因为编译器的编译特性,这种声明方式,只是一个指向固定位置的偏移量常量,


  1. 为什么要使用零长数组
  2. 使用零长数组,有两个方面的考虑:避免空间浪费 (这是相对于定长数组)
  3. 内存连续使用,对于使用索引访问优化效率提供帮助(这是相对与指针数组)


  1. 怎么使用零长数组?
  2. 零长数组作为 GNU 在标准c/c++ 之上的扩展,是支持 C语言 和 c++ 语言的
  3. 使用时需要在最后定义。
  4. 本质是将指针越界的问题,合理化的扩展应用。
  5. 具体使用方式

声明时:char chBuffer[0] 具体实例

struck myInfo{
...
int iLen;
char chBuffer[0];
}


  1. 使用时: 需要在申请堆空间时添加需要长度的额外内容 具体实例
...
 if(zeroBuffer = (struck myInfo*)malloc(sizeof(struck myInfo) + sizeof(char)*NEED_DATA_LEN){
  zeroBuffer->len = NEED_DATA_LEN;
  memset(zeroBuffer->chBuffer, 0x00,NEED_DATA_LEN);
  return zeroBuffer;
 }
 ...


6释放时只需要一次 free 就可。(因为连续内存,不会造成内存泄露 “针对指针数组而言“) 具体实例:

...
  if(zeroBuffer != NULL){
      free(zeroBuffer);
      zeroBuffer = NULL;
  }
  ...


  1. 应用场景:
  2. 接受数据的具体内容长度不定。
  3. 要求索引访问数据块
  4. 期望提升 访问速度的场景。

扩展思考:

如果系统内海量的使用 ,并且处理流程被拉的过长,会有什么问题?

  1. 海量使用会让数据大量堆积在内存中,如果过量,会影响其他服务的正常处理。
  2. 怎么处理:使用Io复用;扩展存储到磁盘;优化数据处理流程;中间过程文件先保存,后续处理直接接替;

能否复用?

  1. 如果数据大致有一个使用长度范围的情况下,可以。
  2. 但是在这种情况下,直接使用定长数据也可以。
  3. 如果数据过大,也可以使用指针。

这种申请释放的模式 适合频繁使用吗?

  1. 其实STL 底层 也有这种思想的体现,比如 vector
  2. 这部分的资源使用,我们是可以接受的。
  3. 柔性数组的类型是固定的吗
  4. 不是的,之所以使用char 是因为他的长度是一个字节,对于数据存储更方便。
  5. 如果能够明确 数据传输时 以4字节为最小单位的时候, 那么int 类型也是可以的。

服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI

目录
相关文章
|
9月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
335 26
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
721 0
一文彻底搞明白C语言的数组
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
395 5
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
1076 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
512 5
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
373 4
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
319 6