新闻中心

EEPW首页 > 测试测量 > 设计应用 > labview深入探索------类型转换、数组字符串与内存管理

labview深入探索------类型转换、数组字符串与内存管理

作者: 时间:2017-01-09 来源:网络 收藏



很多时候,我们无法预先知道我们需要的数组大小,比如我们需要一个字符串数组,来记录报警信息,无法知道会有多少报警发生,这样就需要根据实际情况,来不断地改变数组的大小,一个比较好的方法是每次申请一定数量的内存,而不是一个元素的大小,这样,当内存再次需要的时候,我们可以再次申请,当整个循环结束的时候,我们可以去掉多余的空间,得到结果。



内存碎片的问题,对于任何编程语言都是存在的,当内存碎片越来越多的情况下,程序运行会越来越慢,内存管理器要进行大量的搜索试图找到可用的空间,碎片是如何产生的那,比如我们有三个操作ABC,A、B、C分别申请了三块内存,他们是连续的,当B的内存释放的时候,在A、C中间的内存区域就成了碎片,当我们在一个子VI中不断地用BUILD ARRAY或者conctenate string 时,不断引起内存的申请和释放,这样,内存空间碎片会越来越多。也就是内存的间隙越来越多,作为LV的用户,我们没有办法控制内存碎片,只能尽量地使用固定长度的数组或者字符串,我们可以做一个标志,用不太可能的数据来填充这个数组,这样通过这个特殊的数或者特殊字符,就可以得到实际数据。

本文引用地址:https://www.eepw.com.cn/article/201701/337267.htm

labview内部是如何存储数组和字符串的

了解数组在内存中的存储形式非常重要,有助于合理组织数据,高效利用内存.有助于理解和使用CIN,有助于理解和使用动态链接库.一般都会认为只有大的数组结构或者字符串才消耗大量的内存,其实不然,由于LABVIEW在内存中构造数据的特殊形式,较小的数组或者字符串有时也会占用可观的内存.



对于一维数值型数组,它包括四个字节(I32)的数组长度,之后是连续的数据元素所占的空间。

对于二维的数值型数组,它包括两个I32(8个字节)表示数组行列长度,之后是按行存储的元素序列。

正如我们看到的,LV在内存中是一段连续的空间来存储数据的,这样当需要增加数组长度的时候,由于内存碎片的影响,LV可能不得不移动整个数组到一个新的内存位置。除了存储实际数据,LV还额外增加了数组长度(I32类型),所以,对一维数组,最大可以包括2的32次方-1个元素。

BOOLEAN型数据是字节型数据,该字节非零则为TRUE,为0则为FALSE,BOOLEAN型数组在内存中的分布看下图。



同C语言一样,字符串是一个字符型数组,不同的是,C字符串并不表明字符串长度,它是以作为结束符的,而LV则不同,它的字符串本身就包含了长度信息,同数组一样。


所以,一个字符串最多可包含2^32-1个字符,约2G字符。


字符串数组是非常特殊的,这也是CLF和CIN的难点。字符串在内存中是连续存储的,但是字符串数组却不同与一般的连续存放的二维数组,字符串数组中的元素,即字符串是以长度开头连续存储的,字符串数组本身是存储在内存中另外位置的。




字符串数组是以I32长度开头的,这和一般数组是相同的,接下来是每个字符串的首地址指针,U32数值,表示字符串在内存中的地址(第一个字符),称做句柄(HANDLE)。

从内存中的不同区域访问数据,相对于连续区域,需要消耗更多的时间,因此,用一个长的字符串代替字符串数组,程序会更加高效。

由于字符串数组的这种组织形式,大量的空字符串组成的数组耗费的内存空间也是很大的,需要特别引起注意。




10K个字符串包括10K个句柄,总计10K*4=40K空间,每个字符串的长度是4个字节,总计10K*4=40K,如果加上前面板的操作数据,那所占内存空间就是非常大的了。

上面描述了数组和字符串在内存中的组织形式,还有一点也需要注意,LABVIEW是以句柄的形式,来描述数组和字符串本身的,句柄是WINDOWS里常用的概念,是指针的指针,比如窗口句柄HWND,它本身是U32,四个字节,它包含的内容是指向一个数据结构的指针,因为数据结构在内存中是可以重新分配的,所以它的地址会经常发生变化,而句柄的地址是不会变化的,这样通过句柄,我们就可以跟踪这个变化的数据结构,LABVIEW中的字符串和数组也是采用这种方式。
另外,对于每个数组和字符串,在长度信息之前还有一个16个字节的头部信息,(LV内部使用,类型描述符),这样,对于一个最简单的数组,它至少需要24个字节:HANDLE(4)+HEADER(16)+SIZE(4)=24 BYTE。


上一页 1 2 下一页

评论


技术专区

关闭