これは、Qt コンテナーのサイズでしばらく前に尋ねた別の質問に関連しています: QMap は Qlist よりもはるかに大きいですか? .
基本的に、アイテムを追加できる非常に軽いコンテナを再実装したいと思います(最後か最初かは関係ありません-いいえ、メモリ内で連続している必要はありません...非常に好きですリスト)。追加するだけで、他の関数は必要ありません。コンテナ内の要素の数を返す「count()」または「size()」関数なので、それぞれをループできます。
これは、これらのコンテナーを多数作成し、多くのメモリ スペースを占有するためです (他の質問を参照してください)。
そのような挑戦を思いついた人はいますか?私は Web を見回しましたが、バストのほとんどが STL コンテナーを再実装しましたが、これはまだ私には大きすぎます。私が今フォローしているアイデアは、最も単純な (forward_list) STL コンテナーを何らかの方法で書き直すことですが、私はそのカンフーではありませんが、試してみます。
お時間をいただきありがとうございます。
フランチェスコ
3 に答える
std::vector
コンテナと同じくらい軽量だと思います。一定のオーバーヘッドがあるだけで、要素ごとにデータを追加しません。ここで、gcc の の実装がstd::vector
(32 ビット システムで) 12 バイトを占めることがわかります。これよりもはるかに少ないものはありません。
すべてのおかげで、ここに良い入力があります。最終的に次のように切り詰めました:
1 - 以下は私の情報を保持するクラスです: ここにパディングするための提案はありますか? float=32bits, + 16 + 16 + 8 + 8 + 8として問題ないように見えます。とにかく 32 ビット チャンクにパディングされるため、追加のメモリを使用せずにここに別の 8 ビット要素を追加できると仮定するのは正しいですか?
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 - 各セルのメトリック クラス (1) へのポインターを保持する QList。したがって、[rows*cols] のサイズ: @MattPhillips STD コンテナーと @Angew の使用を検討します。
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);
???? 多分私は何かが欠けています。