微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > labview深入探索------类型转换、数组字符串与内存管理

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

时间:01-09 来源:互联网 点击:

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

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



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

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

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

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


同C语言一样,字符串是一个字符型数组,不同的是,C字符串并不表明字符串长度,它是以\0作为结束符的,而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。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top