1. 程式人生 > >TTCN3新執行器系列-如何最小化類的成員函式(對拷貝構造和賦值操作函式的反思)

TTCN3新執行器系列-如何最小化類的成員函式(對拷貝構造和賦值操作函式的反思)

2009年4月份,我們的TTCN3新執行器大體功能已經完成了,於是找了幾個專案來試點應用。

應用效果不太理想,特別是對於5萬行以上的指令碼工程,且包括大asn檔案的情況。

新執行器轉換出來的C++程式碼量很大,特別是由於asn型別很多,導致hpp檔案程式碼量大的編譯速度下降嚴重問題。

當時的資料大概是這樣的,大asn檔案存在5千多個不同的型別(約5萬行),包括簡單和複雜型別,

平均每個型別轉換後的hpp程式碼量,約20行,合計超過1萬行的hpp檔案,全編譯一次約30分鐘時間(30萬代碼量),使用者不接受。

我們曾經考慮過windows的pch方法來加快編譯速度,但不可行,因為使用者型別是可變的。

最後,只能從轉換的hpp程式碼入手,看看那些可以省略的。

當時一個型別包括的成員函式大概如下:

1、預設建構函式

2、引數為基類的建構函式

3、拷貝建構函式

4、賦值操作函式

5、引數為基類的賦值操作函式

6、靜態clone函式

7、解構函式

從上面的成員函式來看,已經很精簡的了,用於比較操作的函式已經直接在基類中實現。

但我們還是發現了一個問題,就是建構函式和賦值函式使用過多,

這樣做的原因,是為了簡化轉換器的邏輯,譬如:

var  myType  t1;

var  myType  t2  :=  t1;  //這裡轉換後的C++程式碼可以通過拷貝建構函式實現

t2  :=  t1;  //這裡轉換後的C++程式碼可以通過賦值操作函式實現

正因為C++支援操作符號過載,所以可以很方便的簡化轉換器的處理邏輯。

但也是因為這個問題,導致建構函式和賦值操作函式濫用,hpp檔案過大,編譯速度下降。

於是,我們重複問自己,這真的有必要嘛?

當然沒有必要,其實所有這些都可以簡單通過使用一個虛擬函式實現,如

virtual bool assignValue(const& baseType);

簡單來說就是,轉換器需要使用assignValue代替=符號,於是拷貝構造和賦值操作函式都不需要了。

由於assignValue的引數是基類引用,所以一個函式就可以搞定多種情況。

就這樣,原來一個類需要20行的hpp程式碼量,現在下降到10行,編譯效能提升2倍(這也驗證了hpp檔案對編譯速度影響很大)。

這個方案將大工程的編譯速度從30分鐘下降到10分鐘,

但後來我們找到一個更根本的方法,從而有從10分鐘下降到3分鐘,後續再說。