四时宝库

程序员的知识宝库

C++柔性数组简单使用(结构体柔性数组)

今天在做项目的过程中,遇到了一个缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1k,MAX_LENGTH 为 1024。结构体如下:

数据大小可以利用sizeof进行计算,正常一个int类型加一个char * MAX_LENGTH类型,为了防止数据溢出,通常会会开辟一个更大的范围,但是这样的缺点是当数据量很小的时候会造成内存冗余,比如暂存的数据为512字节,但是由于开了1024字节的内存,会造成512字节的内存浪费。

柔性数组

什么是柔性数组:柔性数组成员(flexible array member)也叫伸缩性数组成员,这种代码结构产生于对动态结构体的需求。

在编程过程中经常会利用存放一些动态长度的字符串,C99将其收入标准库中。

其标准定义如下

  • 柔性数组成员必须定义在结构体里面且为最后元素;
  • 结构体中不能单独只有柔性数组成员;
  • 柔性数组不占内存。

一定是在结构体内,并且是最后一个元素是一个空的数组,这样就可以使结构体是变长的。sizeof(test)的结果是short的大小,长度为0的数组不占用空间,只是一个偏移量。

但对于这个数组的大小,我们可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

对于柔性数组的这个特点,很容易构造出变长结构体,如缓冲区,数据包等。

常用于构造不定长数据包,不会浪费空间和流量,例如:

可以减少内存碎片,由于结构体的柔性数组和结构体成员的地址是连续的,即可一同申请内存,因此更大程度地避免了内存碎片。另外由于该成员本身不占结构体空间,因此,整体而言,比普通的数组成员占用空间要会稍微小点。

总结

在日常编程中,有时需要在结构体中存放一个长度是动态的字符串(也可能是其他数据类型),可以使用柔性数组,柔性数组是一种能够巧妙地解决数组内存的冗余和数组的越界问题一种方法。非常值得大家学习和借鉴。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接