1

这与我不久前在 Qt 容器大小中提出的另一个问题有关:QMap 是否比 Qlist 大得多?.

基本上我真的很想重新实现一个 VERY LIGHT 容器,它允许添加项目(不管是在最后还是在开始 - 而且不,它们不必在内存中连续......非常喜欢列表)。不需要其他函数,只需要添加一个“count()”或“size()”函数来返回容器中元素的数量,这样我就可以遍历每个。

这是因为我创建了大量这些容器,它们占用了大量内存空间(请参阅我的另一个问题)。

有没有人提出这样的挑战?我环顾网络,发现大多数重新实现了一个 STL 容器,这对我来说仍然太大。我现在遵循的想法是以某种方式重写最简单的(forward_list)STL容器,但我不是那种功夫,但我会尝试。

感谢您的时间。
弗朗切斯科

4

3 回答 3

3

我认为std::vector与容器一样轻巧。它只有恒定的开销,不会为每个元素添加任何数据。您可以在这里看到 gcc 的实现std::vector占用 12 个字节(在 32 位系统上)。你不会得到比这更少的。

于 2013-05-16T18:12:43.247 回答
0

感谢所有人,这里有很好的输入。我终于把它修剪成以下内容:

1 - 下面是保存我信息的类:这里有填充的建议吗?看起来不错,因为 float=32bits, + 16 + 16 + 8 + 8 + 8。我是否正确假设我可以在这里添加另一个 8bit 元素而不会使用额外的内存,因为它无论如何都会填充到 32bit 块?

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) 的指针,因此大小为 [rows*cols]:@MattPhillips 我将研究使用 STD 容器和 @Angew 可能是 forward_lists 而不是 QList

typedef  QList< WFM >* metricsP;
metricsP *mappedMetrics;
mappedMetrics = new metricsP[rows*cols]; 

这应该削减它。稍后我将添加一些基准。
感谢大家的宝贵时间,不胜感激!
欢迎任何其他意见。

弗朗切斯科

于 2013-05-20T06:36:14.207 回答
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);

???也许我错过了一些东西。

于 2013-05-20T15:12:56.873 回答