labview深入探索------类型转换、数组字符串与内存管理
labview内部是如何存储数组和字符串的 了解数组在内存中的存储形式非常重要,有助于合理组织数据,高效利用内存.有助于理解和使用CIN,有助于理解和使用动态链接库.一般都会认为只有大的数组结构或者字符串才消耗大量的内存,其实不然,由于LABVIEW在内存中构造数据的特殊形式,较小的数组或者字符串有时也会占用可观的内存. 对于二维的数值型数组,它包括两个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)。 从内存中的不同区域访问数据,相对于连续区域,需要消耗更多的时间,因此,用一个长的字符串代替字符串数组,程序会更加高效。 由于字符串数组的这种组织形式,大量的空字符串组成的数组耗费的内存空间也是很大的,需要特别引起注意。
对于一维数值型数组,它包括四个字节(I32)的数组长度,之后是连续的数据元素所占的空间。



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。
labview类型转换数组字符串内存管 相关文章:
- 频宽、取样速率及奈奎斯特定理(09-14)
- 为什么要进行信号调理?(09-30)
- IEEE802.16-2004 WiMAX物理层操作和测量(09-16)
- 为任意波形发生器增加价值(10-27)
- 基于PCI 总线的高速数据采集系统(09-30)
- 泰克全新VM6000视频测试仪助力数字电视等产品测试 (10-06)
