2010-04-22 305 views
3

相同的CMap,CList,幾乎所有使用模板(我猜)。CArray <int, int>和CArray <int, int&>有何區別?

我覺得有點難以理解何時使用哪個。確實,對於課程等,<class, class&>表格通常是您想要的,但對於基本類型,如int,float等,哪種形式是優選的?

回答

4

我會說,如果你不需要其他東西,只需使用CArray<Type>ARG_TYPE將是其默認const TYPE&。實際上使用Type&作爲ARG_TYPE不是一個好主意。理論上這允許CArray修改您傳遞給相應方法的對象/值。當然CArray不會做這樣的事情,但最好是安全起見。

如果你看一下MS VC中可用的源代碼,你會發現ARG_TYPE在一些方法中用作參數的類型,該參數爲數組的某些元素保存新值,例如

void SetAt(INT_PTR nIndex, ARG_TYPE newElement) 
INT_PTR Add(ARG_TYPE newElement) 
void SetAt(INT_PTR nIndex, ARG_TYPE newElement) 
void InsertAt(INT_PTR nIndex, ARG_TYPE newElement, INT_PTR nCount = 1) 

如果在進行Typeconst Type&之間的選擇,那麼受影響的唯一的事情就是有多少次和數據將被複制。當值通過引用傳遞時,實際上只傳遞指向它的指針。這對於對象來說非常重要(額外的拷貝構造函數調用),但對簡單類型無關緊要。當然你可以嘗試通過強制複製charshort比相應的指針(取決於平臺的32/64位)更小來節省幾個字節,但我不認爲這真的值得額外的麻煩。正如我之前所說,我認爲使用默認CArray<Type>是一種很好的方法,除非你真的有理由去改變它。

2

我經常遇到同樣的問題,目前正試圖解決一個奇怪的錯誤,我認爲這個錯誤與這種差異有關。我不能肯定我完全理解什麼是對還沒有打算,但考慮到這一操作:

a.Add(a[0]); 

如果被聲明爲CArray<int, int&>,然後有一個粗略的情況下,當一個是太小,無法處理的加法和必須長大。 SetAtGrow()被調用並放大該數組的副本。不幸的是,現在對[0]的引用是對數組移動後對無效內存的引用。

如果被聲明爲CArray<int, int>然後傳遞給add函數[0]的副本,也沒有問題。

同樣,我仍然試圖解決這個問題(這就是爲什麼我最終找到了這個討論),但是如果您在執行操作時引用了自己的CArray,那麼使用引用似乎存在一個微妙的問題會增加其規模。你不能相信這個參考,所以CArray<int, int>似乎是首選。

相關問題