這與我在Size of Qt containers: is QMap much larger than Qlist?回過頭的另一個問題有關。
基本上我真的很想重新實現一個VERY LIGHT容器,它允許添加項目(無論是在最後還是在開始時都是如此 - 不需要,它們不必在內存中連續存在......非常像列表)。沒有其他函數是必需的,只需追加,並使用「count()」或「size()」函數返回容器中的元素數量,這樣我就可以遍歷每個元素。
這是因爲我創建了大量的這些容器,並佔用了大量內存空間(請參閱我的其他問題)。
有沒有人想出這樣的挑戰?我環顧網絡,胸圍大部分重新實施了STL容器,這對我來說仍然太大。我現在遵循的想法是以某種方式重寫最簡單的(forward_list)STL容器,但我不是那種功夫,但我會嘗試。
謝謝你的時間。
弗朗切斯科C++ light appendable數組容器
回答
我認爲std::vector
大約是輕量級容器得到。它只有不斷的開銷,不會爲每個元素添加任何數據。你可以see here gcc的實現std::vector
佔用12個字節(在32位系統上)。你不會比這少得多。
我肯定會嘗試'std :: vector'開始,但它並非沒有問題:當項目被添加時,重新分配(元素拷貝構造和銷燬)可能會非常痛苦的前C + +11系統,並且可能導致內存碎片不良。 – Roddy
也就是說,不幸的是一個重要的點,因爲很多東西被添加。 @Angew我真的很喜歡「12字節」的部分,我正在尋找有關的參考。聽起來很小。我會查找std :: list佔用了多少,聽起來相當不錯。 – Francesco
@Francesco請注意,'std :: list'會爲每個元素添加2個指針* * std :: forward_list爲每個元素添加1個指針。如果你關心內存佔用情況,這些可以快速加起來(特別是如果你的元素很小)。 – Angew
感謝這裏所有的好投入。我終於把它縮小到以下內容:
1 - 以下是持有我的信息的類:有關填充的任何建議嗎?看起來沒問題,因爲float = 32bits,+ 16 + 16 + 8 + 8 + 8. 我正確地假設我可以在這裏添加另一個8位元素,而不會導致額外的內存使用,因爲它無論如何填充到32位塊?
class WFM {
public:
float h;
quint16 fwhm2;
quint16 sens2;
quint8 fwhm;
quint8 sens;
quint8 nAmplitude;
WFM(){ h=0; fwhm2=0; sens2=0; fwhm=0; sens=0; nAmplitude=0; }
};
2 - 甲的QList保持一個指針,指向我的度量類別(1)針對每個小區,從而具有尺寸的[行×COLS]:@MattPhillips我會考慮使用STD容器和@Angew大概forward_lists而不是QList
typedef QList<WFM>* metricsP;
metricsP *mappedMetrics;
mappedMetrics = new metricsP[rows*cols];
這應該修剪它。稍後我會添加一些基準。
謝謝大家你的時間,感謝你!
歡迎任何其他意見。
弗朗西斯
從基準不知何故,我發現原來的QList < WFM *>比的QList < WFM更好>。
爲什麼
QList<WFM> *qlist = new QList<WFM>();
WFM wfmobj;
wfmobj.fwhm2=5;
wfmobj.sens2=6;
wfmobj.fwhm=7;
wfmobj.sens=5;
wfmobj.nAmplitude=3;
qlist->append(wfmobj);
更多的內存,比吃
QList< WFM* > *qlist = new QList< WFM* >();
WFM *wfmobj = new WFM();
wfmobj->fwhm2=5;
wfmobj->sens2=6;
wfmobj->fwhm=7;
wfmobj->sens=5;
wfmobj->nAmplitude=3;
qlist->append(wfmobj);
???? 也許我錯過了一些東西。
- 1. C#組件容器
- 2. Light C Unicode庫
- 3. Light Sql數據庫
- 4. C - 數組內容交換
- 5. C++容器/數組/元組一致訪問接口
- 6. MVVM Light RelayCommand參數
- 7. mvvm-light和silverlight 4的兼容性
- 8. IOS Light weigth web服務器
- 9. 將JPanel數組添加到容器
- 10. 如何在C++中輸出容器數組的動態數組值?
- 11. 可變模板多維數組容器
- 12. 可變長度數組C++包裝容器
- 13. 類似於動態數組的C++容器?
- 14. 方法,用來初始化數組容器C++
- 15. 未知容器,向量或數組的大小C++
- 16. SFINAE-ING任何容器成C數組視圖
- 17. C#IoC容器
- 18. C++容器
- 19. C++ STL容器
- 20. C++從容器
- 21. 數組中的線程安全容器
- 22. MVVM Light - ViewModel reusage
- 23. C++中的數組內容相等
- 24. c#數組不打印內容
- 25. C指針和數組不兼容
- 26. C編程。比較數組的內容。
- 27. C#/ Java/Velocity獲取數組的內容
- 28. c + +洗牌動態數組的內容?
- 29. Light userdata as table keys
- 30. MVVM Light - PivotControl
呃,'std :: vector'?這不夠好嗎? – jrok
數據結構佔用的空間大多數將取決於「容器」本身的大小。除非您更改容器,否則向其添加附加功能不會明顯改變佔用的空間量。 –
我不知道相對大小,但看看'QSet'。然而,總的來說,我已經離開了Qt的STL容器,並沒有回頭看,特別是自C++ 11以來。 –