PFTL101B 20KN 3BSE004203R1
PFTL101B 20KN 3BSE004203R1
雖然當(dāng)今的嵌入式系統(tǒng)的內(nèi)存比之以K計(jì)數(shù)的時(shí)代已經(jīng)有了很大的提高,但是隨著軟件規(guī)模的增長(zhǎng),內(nèi)存不足的問(wèn)題依然時(shí)時(shí)困擾著系統(tǒng)架構(gòu)師。有一些原則,架構(gòu)師在進(jìn)行設(shè)計(jì)決策的時(shí)候可以參考:
2.3.1. 虛擬內(nèi)存技術(shù)
有一些嵌入式設(shè)備需要處理巨大的數(shù)據(jù)量,而這些數(shù)據(jù)不可能全部裝入內(nèi)存中。一些嵌入式操作系統(tǒng)不提供虛擬內(nèi)存技術(shù),比如WinCE4.2每個(gè)程序最多只能使用32M內(nèi)存。對(duì)這樣的應(yīng)用,架構(gòu)師應(yīng)該特別設(shè)計(jì)自己的虛擬內(nèi)存技術(shù)。所謂的虛擬內(nèi)存技術(shù)的核心是,將暫時(shí)不太可能使用的數(shù)據(jù)移出內(nèi)存。這涉及到一些技術(shù)點(diǎn):
引用計(jì)數(shù),正在使用的數(shù)據(jù)不能移出。
使用預(yù)測(cè),預(yù)測(cè)下一個(gè)階段某個(gè)數(shù)據(jù)的使用可能性。基于預(yù)測(cè)移出數(shù)據(jù)或者提前裝入數(shù)據(jù)。
占位數(shù)據(jù)/對(duì)象。
高速緩存。在復(fù)雜數(shù)據(jù)結(jié)果下緩存高頻率使用的數(shù)據(jù),直接訪問(wèn)。
快速的持久化和裝載。
下圖是一個(gè)全國(guó)電信機(jī)房管理系統(tǒng)的界面示意圖:
每個(gè)節(jié)點(diǎn)下都有大量的數(shù)據(jù)需要裝載,可以使用上述技術(shù)將內(nèi)存占用降到最低。
2.3.2. 兩段式構(gòu)造
在內(nèi)存有限的系統(tǒng)里,對(duì)象構(gòu)造失敗是必須要處理的問(wèn)題,失敗的原因中最常見(jiàn)的則是內(nèi)存不足(實(shí)際上這也是對(duì)PC平臺(tái)的要求,但是在實(shí)際中往往忽略,因?yàn)閮?nèi)存實(shí)在便宜)。兩段式構(gòu)造就是一種常用而有效的設(shè)計(jì)。舉例來(lái)說(shuō):
CMySimpleClass:
class CMySimpleClass
{
?public:
?CMySimpleClass();
?~CMySimpleClass();
?...
?private:
?int SomeData;
};
CMyCompoundClass:
class CMyCompoundClass
{
?public:
?CMyCompoundClass();
?~CMyCompoundClass();
?...
?private:
?CMySimpleClass* iSimpleClass;
};
在CMyCompoundClass的構(gòu)造函數(shù)里初始化iSimpleClass對(duì)象。
CMyCompoundClass::CMyCompoundClass()
{
?iSimpleClass = new CMySimpleClass;
}
當(dāng)創(chuàng)建CMyCompoundClass的時(shí)候會(huì)發(fā)生什么呢?
CMyCompoundClass* myCompoundClass = new CMyCompoundClass;
為CMyCompoundClass的對(duì)象分配內(nèi)存
調(diào)用CMyCompoundClass對(duì)象的構(gòu)造函數(shù)
在構(gòu)造函數(shù)中創(chuàng)建一個(gè)CMySimpleClass的實(shí)例
構(gòu)造函數(shù)結(jié)束返回
一切看起來(lái)都很簡(jiǎn)單,但是如果第三步創(chuàng)建CMySimpleClass對(duì)象的時(shí)候發(fā)生內(nèi)存不足的錯(cuò)誤怎么辦呢?構(gòu)造函數(shù)無(wú)法返回任何錯(cuò)誤信息以提示調(diào)用者構(gòu)造沒(méi)有成功。調(diào)用者于是獲得了一個(gè)指向CMyCompoundClass的指針,但是這個(gè)對(duì)象并沒(méi)有構(gòu)造完整。
如果在構(gòu)造函數(shù)中拋出異常會(huì)怎么樣呢?這是個(gè)著名的噩夢(mèng),因?yàn)槲鰳?gòu)函數(shù)不會(huì)被調(diào)用,在創(chuàng)建CMySimpleClass對(duì)象之前如果分配了資源就會(huì)泄露。關(guān)于在構(gòu)造函數(shù)中拋出異常可以單講一個(gè)小時(shí),但是有一個(gè)建議是:盡量避免在構(gòu)造函數(shù)中拋出異常。
所以,使用兩段式構(gòu)造法是一個(gè)更好的選擇。簡(jiǎn)單的說(shuō),就是在構(gòu)造函數(shù)避免任何可能產(chǎn)生錯(cuò)誤的動(dòng)作,比如分配內(nèi)存,而把這些動(dòng)作放在構(gòu)造完成之后,調(diào)用另一個(gè)函數(shù)。比如: