新聞中心

EEPW首頁 > 測試測量 > 設(shè)計(jì)應(yīng)用 > labview深入探索------類型轉(zhuǎn)換、數(shù)組字符串與內(nèi)存管理

labview深入探索------類型轉(zhuǎn)換、數(shù)組字符串與內(nèi)存管理

作者: 時(shí)間:2017-01-09 來源:網(wǎng)絡(luò) 收藏



很多時(shí)候,我們無法預(yù)先知道我們需要的數(shù)組大小,比如我們需要一個(gè)字符串?dāng)?shù)組,來記錄報(bào)警信息,無法知道會有多少報(bào)警發(fā)生,這樣就需要根據(jù)實(shí)際情況,來不斷地改變數(shù)組的大小,一個(gè)比較好的方法是每次申請一定數(shù)量的內(nèi)存,而不是一個(gè)元素的大小,這樣,當(dāng)內(nèi)存再次需要的時(shí)候,我們可以再次申請,當(dāng)整個(gè)循環(huán)結(jié)束的時(shí)候,我們可以去掉多余的空間,得到結(jié)果。



內(nèi)存碎片的問題,對于任何編程語言都是存在的,當(dāng)內(nèi)存碎片越來越多的情況下,程序運(yùn)行會越來越慢,內(nèi)存管理器要進(jìn)行大量的搜索試圖找到可用的空間,碎片是如何產(chǎn)生的那,比如我們有三個(gè)操作ABC,A、B、C分別申請了三塊內(nèi)存,他們是連續(xù)的,當(dāng)B的內(nèi)存釋放的時(shí)候,在A、C中間的內(nèi)存區(qū)域就成了碎片,當(dāng)我們在一個(gè)子VI中不斷地用BUILD ARRAY或者conctenate string 時(shí),不斷引起內(nèi)存的申請和釋放,這樣,內(nèi)存空間碎片會越來越多。也就是內(nèi)存的間隙越來越多,作為LV的用戶,我們沒有辦法控制內(nèi)存碎片,只能盡量地使用固定長度的數(shù)組或者字符串,我們可以做一個(gè)標(biāo)志,用不太可能的數(shù)據(jù)來填充這個(gè)數(shù)組,這樣通過這個(gè)特殊的數(shù)或者特殊字符,就可以得到實(shí)際數(shù)據(jù)。

本文引用地址:http://butianyuan.cn/article/201701/337267.htm

labview內(nèi)部是如何存儲數(shù)組和字符串的

了解數(shù)組在內(nèi)存中的存儲形式非常重要,有助于合理組織數(shù)據(jù),高效利用內(nèi)存.有助于理解和使用CIN,有助于理解和使用動(dòng)態(tài)鏈接庫.一般都會認(rèn)為只有大的數(shù)組結(jié)構(gòu)或者字符串才消耗大量的內(nèi)存,其實(shí)不然,由于LABVIEW在內(nèi)存中構(gòu)造數(shù)據(jù)的特殊形式,較小的數(shù)組或者字符串有時(shí)也會占用可觀的內(nèi)存.



對于一維數(shù)值型數(shù)組,它包括四個(gè)字節(jié)(I32)的數(shù)組長度,之后是連續(xù)的數(shù)據(jù)元素所占的空間。

對于二維的數(shù)值型數(shù)組,它包括兩個(gè)I32(8個(gè)字節(jié))表示數(shù)組行列長度,之后是按行存儲的元素序列。

正如我們看到的,LV在內(nèi)存中是一段連續(xù)的空間來存儲數(shù)據(jù)的,這樣當(dāng)需要增加數(shù)組長度的時(shí)候,由于內(nèi)存碎片的影響,LV可能不得不移動(dòng)整個(gè)數(shù)組到一個(gè)新的內(nèi)存位置。除了存儲實(shí)際數(shù)據(jù),LV還額外增加了數(shù)組長度(I32類型),所以,對一維數(shù)組,最大可以包括2的32次方-1個(gè)元素。

BOOLEAN型數(shù)據(jù)是字節(jié)型數(shù)據(jù),該字節(jié)非零則為TRUE,為0則為FALSE,BOOLEAN型數(shù)組在內(nèi)存中的分布看下圖。



同C語言一樣,字符串是一個(gè)字符型數(shù)組,不同的是,C字符串并不表明字符串長度,它是以