发明内容
本发明实施例提供一种变长数据的存储方法与装置,旨在解决现有技术中的数据包不能存放在一块连续内存中的问题。
本发明实施例是这样实现的,一种变长数据的存储方法,所述方法包括:
查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;
是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将所述变长数据从数据存放区的首址开始存入,否则将所述变长数据从数据存放区的最后一组数据的末地址后开始存入。
本发明实施例还提供一种变长数据的存储装置,所述装置包括:
空间查询单元,用于查询缓存区域的空闲空间大小;所述缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
空闲空间大小判断单元,用于当所述空闲空间大小大于变长数据的大小时,判断所述变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在所述数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将所述变长数据从数据存放区的首址开始存入,否则将所述变长数据从数据存放区的最后一组数据的末地址开始存入。
本发明的缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区,在判断变长数据的大小大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,通过在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,使得存放的数据始终存放在一块连续的内存中,在存取数据时相当于直接在内存内访问,不需要开辟新的内存区域,实时性高,数据存取相对较快,稳定性强,所有数据缓存区域是一块连续的内存,都会被循环利用,且不会不停的分配和释放内存,所以不存在内存碎片,且这种实现方式,占用代码空间小。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
图1示出了本发明实施例提供的一种变长数据的存储方法流程图,详述如下:
在步骤S101中,查询缓存区域的空闲空间大小;缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
在本发明实施例中,将缓存区域分为数据存指针存放区、数据读指针存放区、保留区以及数据存放区,其中,将数据存放区分为数据首址存放区、有效数据存放区、数据缓存终止标识存放区以及数据缓存结束地址存放区,如下表1所示:
表1
其中,将缓存区域空间内存的0-3字节用于存放数据存指针,4-7字节用于存放数据读指针,8-15字节为保留区,16-1023为数据存放区(B为起始地址0x10(十六进制为16),E为结束地址0x400(十进制为1024))。
本发明需要实现的函数模块如表2所示:
1.SetSize(int size)设置数据缓存区域尺寸 |
2.Clear()清除缓存区域里的保存数据 |
3.bool Empty()检查缓存区域是否存有有效数据 |
4.Push(void*pdata)将数据压入缓存区域 |
5.Pop()将最前一笔数据出栈 |
6.void*Front()取出最前一笔数据,即得到这笔数据的缓存区首址 |
7.int GetFree()得缓存区域剩余空间的大小 |
表2
在步骤S102中,当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则执行步骤S103,否则执行步骤S104;
在步骤S103中,在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入;
在步骤S104中,将变长数据从数据存放区的最后一组数据的末地址后开始存入。
在本发明实施例中,要保存的数据通过调用GetFree函数得到缓存区空闲空间的大小,如果有空闲空间,调用Push函数将数据存入内存块。另外,需要读取该缓存中的数据时,可以调用Empty函数检查是否存在有效数据包,如果不为空表示存在有效数据包,调用Front函数直接读取里面的数据,可以通过memcpy(C语言标准库函数,内存数据复制函数)、数组、指针等以先进先出原则访问方式访问该数据,因为里面的数据存放在一块连续的内存中,不需要开辟新的内存区域。当时用完这块数据后,然后在调用Pop将修改读取指针到下一个有效数据包位置。这种数据缓存机制可以存放不定长度的数据,且无内存数据碎片,同时,具有STL模板相似的函数API,便于学习和使用。
数据存入内存指针到最大内存地址E之间的空间不能存放新数据包时,假如数据存指针位置在D,E-D=128字节空间,要存放的新数据包长度为256,这时我们将在D处设置0X12345678标识,从这块内存地址开始到缓冲区末地址无有效数据,新的有效数据放在头部B开始的区域,取数据时,就从B位置开始取数据包。这样操作虽然会偶尔损失一点内存区域,但存取数据相当于直接在内存中访问,比STL模板实现存取机制快,同时在读取数据时无需开辟新的数据内存,就可以实现数据的处理。
图2示出了本发明实施例提供的一种变长数据出入队列的实现方法流程图,详述如下:
在步骤S201中,开辟内存块,设置数据缓存区域尺寸;
在步骤S202中,查询缓存区域的空闲空间大小;缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区;
在步骤S203中,当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则执行步骤S204,否则执行步骤S205;
在步骤S204中,在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入;
在步骤S205中,将变长数据从数据存放区的最后一组数据的末地址后开始存入;
在步骤S206中,判断数据存指针是否不等于数据读指针,是则执行步骤S207,否则执行步骤S208;
在本发明实施例中,读取数据可以通过判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据。
在步骤S207中,读取该数据;
在步骤S208中,不读取该数据。
在本发明实施例中,如果需要清除缓存区域空间保存的数据只需要调用clear函数,通过设置数据存指针等于数据读指针可以实现。
图3示出了本发明实施例提供的一种变长数据的存储装置结构图,详述如下:
内存开辟单元31在空间查询单元查询缓存区域的空闲空间大小之前,开辟内存块,设置数据缓存区域尺寸。
空间查询单元32查询缓存区域的空闲空间大小;其中,缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区。
空闲空间大小判断单元33当空闲空间大小大于变长数据的大小时,判断变长数据的大小是否大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小;是则在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,否则将变长数据从数据存放区的最后一组数据的末地址开始存入。
数据读取单元34判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据。
在本发明实施例中,读取该数据是通过内存数据复制函数、数组或指针以先进先出原则访问所述有效数据;判断缓存区域是否存有有效数据,是则读取该数据,否则不读取该数据具体为:判断数据存指针是否不等于数据读指针,是则读取该数据,否则不读取该数据;
数据清除单元35清除缓存区域空间保存的数据。
在本发明实施例中,清除缓存区域空间保存的数据具体为:
设置数据存指针等于数据读指针。
本发明的缓存区域包括数据存指针存放区、数据读指针存放区、保留区以及数据存放区,在判断变长数据的大小大于数据存放区中最后一组数据的末地址到数据存放区结束地址之间的内存大小时,通过在数据存放区中最后一组数据的末地址后设置数据缓存终止标识,并将变长数据从数据存放区的首址开始存入,使得存放的数据始终存放在一块连续的内存中,在存取数据时相当于直接在内存内访问,不需要开辟新的内存区域,实时性高,数据存取相对较快,稳定性强,所有数据缓存区域是一块连续的内存,都会被循环利用,且不会不停的分配和释放内存,所以不存在内存碎片,且这种实现方式,占用代码空间小。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。