这与我不久前在 Qt 容器大小中提出的另一个问题有关:QMap 是否比 Qlist 大得多?.
基本上我真的很想重新实现一个 VERY LIGHT 容器,它允许添加项目(不管是在最后还是在开始 - 而且不,它们不必在内存中连续......非常喜欢列表)。不需要其他函数,只需要添加一个“count()”或“size()”函数来返回容器中元素的数量,这样我就可以遍历每个。
这是因为我创建了大量这些容器,它们占用了大量内存空间(请参阅我的另一个问题)。
有没有人提出这样的挑战?我环顾网络,发现大多数重新实现了一个 STL 容器,这对我来说仍然太大。我现在遵循的想法是以某种方式重写最简单的(forward_list)STL容器,但我不是那种功夫,但我会尝试。
感谢您的时间。
弗朗切斯科
问问题
948 次
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 回答