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

目录
相关文章
|
11天前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
41 4
|
18天前
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
28 1
|
23天前
|
存储 编译器 C语言
【C语言基础考研向】09 一维数组
数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。
|
23天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]="hello"`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
26天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
1月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
1月前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
1月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
2月前
|
存储 编译器 数据处理
【编程秘籍】解锁C语言数组的奥秘:从零开始,深入浅出,带你领略数组的魅力与实战技巧!
【8月更文挑战第22天】数组是C语言中存储同类型元素的基本结构。本文从定义出发,详述数组声明、初始化与访问。示例展示如何声明如`int numbers[5];`的数组,并通过下标访问元素。初始化可在声明时进行,如`int numbers[] = {1,2,3,4,5};`,编译器自动计算大小。初始化时未指定的元素默认为0。通过循环可遍历数组,数组名视为指向首元素的指针,方便传递给函数。多维数组表示矩阵,如`int matrix[3][4];`。动态数组利用`malloc()`分配内存,需用`free()`释放以避免内存泄漏。掌握这些技巧是高效数据处理的基础。
56 2
|
1月前
|
编译器 C语言 C++
从C语言到C++
本文档详细介绍了C++相较于C语言的一些改进和新特性,包括类型检查、逻辑类型 `bool`、枚举类型、可赋值的表达式等。同时,文档还讲解了C++中的标准输入输出流 `cin` 和 `cout` 的使用方法及格式化输出技巧。此外,还介绍了函数重载、运算符重载、默认参数等高级特性,并探讨了引用的概念及其应用,包括常引用和引用的本质分析。以下是简要概述: 本文档适合有一定C语言基础的学习者深入了解C++的新特性及其应用。