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


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

    1. 零长数组是什么?
      1. 零长数组做为一种 GNU 的语法扩展方式,为数据处理提供优化支持。
      2. 因为编译器的编译特性,这种声明方式,只是一个指向固定位置的偏移量常量,
    2. 为什么要使用零长数组
      1. 使用零长数组,有两个方面的考虑:避免空间浪费 (这是相对于定长数组)
      2. 内存连续使用,对于使用索引访问优化效率提供帮助(这是相对与指针数组)
    3. 怎么使用零长数组?
      1. 零长数组作为 GNU 在标准c/c++ 之上的扩展,是支持 C语言 和 c++ 语言的
      2. 使用时需要在最后定义。
      3. 本质是将指针越界的问题,合理化的扩展应用。
      4. 具体使用方式
        1. 声明时:char chBuffer[0] 具体实例
          struck myInfo{
          ...
          int iLen;
          char chBuffer[0];
          }
          
          • 1
          • 2
          • 3
          • 4
          • 5
      5. 使用时: 需要在申请堆空间时添加需要长度的额外内容 具体实例
        ...
         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;
         }
         ...  
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      6. 释放时只需要一次 free 就可。(因为连续内存,不会造成内存泄露 “针对指针数组而言“) 具体实例:
          ...
          if(zeroBuffer != NULL){
              free(zeroBuffer);
              zeroBuffer = NULL;
          }
          ...
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
    4. 应用场景:
      1. 接受数据的具体内容长度不定。
      2. 要求索引访问数据块
      3. 期望提升 访问速度的场景。
    5. 扩展思考:
      1. 如果系统内海量的使用 ,并且处理流程被拉的过长,会有什么问题?
        1. 海量使用会让数据大量堆积在内存中,如果过量,会影响其他服务的正常处理。
        2. 怎么处理:使用Io复用;扩展存储到磁盘;优化数据处理流程;中间过程文件先保存,后续处理直接接替;
      2. 能否复用?
        1. 如果数据大致有一个使用长度范围的情况下,可以。
        2. 但是在这种情况下,直接使用定长数据也可以。
        3. 如果数据过大,也可以使用指针。
      3. 这种申请释放的模式 适合频繁使用吗?
        1. 其实STL 底层 也有这种思想的体现,比如 vector
        2. 这部分的资源使用,我们是可以接受的。
      4. 柔性数组的类型是固定的吗
        1. 不是的,之所以使用char 是因为他的长度是一个字节,对于数据存储更方便。
        2. 如果能够明确 数据传输时 以4字节为最小单位的时候, 那么int 类型也是可以的。

    服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783

  • 相关阅读:
    【Robotframework+python】实现http接口自动化测试
    [NCTF2019]SQLi-1||SQL注入
    重读VDSR
    Spark 之 expression
    skynet学习笔记01— skynet开发环境搭建(超详细)与第一个skynet程序
    保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库
    LRU自定义最近最少使用-java实现
    将一个(768,1)的张量转换为(1024,)
    探索Spring Boot的自动配置机制
    Servlet面试题
  • 原文地址:https://blog.csdn.net/qq_29111047/article/details/126554596