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