2013-05-16 47 views
1

這與我在Size of Qt containers: is QMap much larger than Qlist?回過頭的另一個問題有關。

基本上我真的很想重新實現一個VERY LIGHT容器,它允許添加項目(無論是在最後還是在開始時都是如此 - 不需要,它們不必在內存中連續存在......非常像列表)。沒有其他函數是必需的,只需追加,並使用「count()」或「size()」函數返回容器中的元素數量,這樣我就可以遍歷每個元素。

這是因爲我創建了大量的這些容器,並佔用了大量內存空間(請參閱我的其他問題)。

有沒有人想出這樣的挑戰?我環顧網絡,胸圍大部分重新實施了STL容器,這對我來說仍然太大。我現在遵循的想法是以某種方式重寫最簡單的(forward_list)STL容器,但我不是那種功夫,但我會嘗試。

謝謝你的時間。
弗朗切斯科C++ light appendable數組容器

+1

呃,'std :: vector'?這不夠好嗎? – jrok

+1

數據結構佔用的空間大多數將取決於「容器」本身的大小。除非您更改容器,否則向其添加附加功能不會明顯改變佔用的空間量。 –

+1

我不知道相對大小,但看看'QSet'。然而,總的來說,我已經離開了Qt的STL容器,並沒有回頭看,特別是自C++ 11以來。 –

回答

3

我認爲std::vector大約是輕量級容器得到。它只有不斷的開銷,不會爲每個元素添加任何數據。你可以see here gcc的實現std::vector佔用12個字節(在32位系統上)。你不會比這少得多。

+1

我肯定會嘗試'std :: vector'開始,但它並非沒有問題:當項目被添加時,重新分配(元素拷貝構造和銷燬)可能會非常痛苦的前C + +11系統,並且可能導致內存碎片不良。 – Roddy

+0

也就是說,不幸的是一個重要的點,因爲很多東西被添加。 @Angew我真的很喜歡「12字節」的部分,我正在尋找有關的參考。聽起來很小。我會查找std :: list佔用了多少,聽起來相當不錯。 – Francesco

+1

@Francesco請注意,'std :: list'會爲每個元素添加2個指針* * std :: forward_list爲每個元素添加1個指針。如果你關心內存佔用情況,這些可以快速加起來(特別是如果你的元素很小)。 – Angew

0

感謝這裏所有的好投入。我終於把它縮小到以下內容:

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]; 

這應該修剪它。稍後我會添加一些基準。
謝謝大家你的時間,感謝你!
歡迎任何其他意見。

弗朗西斯

0

從基準不知何故,我發現原來的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); 

???? 也許我錯過了一些東西。