0. 前言

(0.1) 這篇文章並不會講 CArray 如何使用,網路範例很多, msdn 也很清楚。

(0.2) 前提是以 POD 為基礎。

(0.3) 以 vector 做為輔助比較。

(0.4) vector / CArray 不一定哪個比較好,但要筆者挑的話,肯定不會挑 CArray,這東西使我想罵粗話。

 

(0.5) 筆者只以 Debug 方式做 trace,Release ( 開 O2) 情況可能有所不同。

 

1. CArray 成員

(1.1) m_pData : 分配出來的記憶體指標。

(1.2) m_nSize : 目前實際上使用的元素個數,這個值就是 GetSize() , GetCount() 之傳回值。

(1.3) m_nMaxSize : 由 m_pData 實際配置出來的元素個數,這個值 Coder 取不出來,也沒辦法 "中途直接" 設定, vector 可以藉由 reserve 做改變。

(1.4) m_nGrowBy : 這是 CArray 記憶體擴展的參考常數,預設是 -1 。若 m_nGrowBy <=0 時,每次要增加容量是增加 1 個;若設成 100,每次要加容量是加 100 個。

2. 記憶體管理策略

(2.1) 增長策略:C++ Primer 裡有提到,vector 管理策略是,如果再加入元素個數,記憶體不夠用了,它將再配置原本容量的 2 倍,這點在 g++ 裡的確如此,而在 vc 裡是 1.5 倍。而 CArray 增長策略,是看當初的 GrowBy 是設成多少,一次加這定量。

(2.2) 縮減策略:vector 在 g++ 裡,當元素個數少於配置的 0.25 (1 / 2 / 2 = 0.25) 時,記憶體會縮一半;vc 裡沒再特別驗證,但猜應是少於配置的 0.45 ( 1/1.5/1.5) 時,縮為原本的 0.67 倍。但 CArray 它完全沒有縮減策略,換句話說除非手動去做 SetSize 動作,否則它是不會降下來的。

(2.3) SetSize:這點不論是 CArray::SetSize 還是 vector::resize 都讓我覺得詬病。做 SetSize 時,會再呼叫 memset 函式做初始化設定。

(2.4) FreeExtra:CArray 做 FreeExtra 時,只留最後有用的部份,其他多的記憶體全放光。效能差的地方在於,他會額外再 allocate 另一塊和 m_nSize 一樣大小的記憶體,把原本的空間整個複制過去 (看到這應該想砍人了吧)。

 

3. 其他特性

(3.1) 間接呼叫 SetSize 之函式 : Add,  Append, Copy, SetAtGrow , InsertAt, Remove All

(3.2) InsertAt : insert 動作不論在 CArray 還是 vector 做法都一樣,都很吃效能。

(3.3) Swap : array 管理之 Swap 事實上應該要很簡單、很快,把 size , capacity, pBuf 全都互換即可,不過這個在 CArray 並沒有提供這函式,只能用 operator = 去做,這就耗時許多了,不知道 vs 有沒有做這方面語意上的優化。

 

-------

看來最後還是免不了要自己再刻一個做管理,再塞回 CArray 裡去,不過塞回去是一個大問題就是了,硬幹幹得到,只是... 唉... 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

arrow
arrow
    全站熱搜

    edisonx 發表在 痞客邦 留言(2) 人氣()