这与我在Size of Qt containers: is QMap much larger than Qlist?回答的另一个问题有关
基本上我真的想重新实现一个非常轻便的容器,允许添加物品(无论是在最后还是在开始时都没关系 - 不,它们不必在记忆中连续......非常像列表)。不需要其他功能,只需追加,并且" count()"或" size()"函数返回容器中的元素数,所以我可以遍历每个元素。
这是因为我创造了大量的这些容器,它们占用了大量的记忆空间(见我的另一个问题)。
有没有人想出这样的容器挑战?我环顾网络,破坏了大部分重新实施的STL容器,这对我来说仍然太大了。我现在遵循的想法是以某种方式重写最简单的(forward_list)STL容器,但我不是功夫,但我会尝试。
谢谢你的时间。
弗朗西斯
答案 0 :(得分:3)
我认为std::vector
和容器一样轻量级。它只有不断的开销,不会为每个元素添加任何数据。您可以see here gcc的std::vector
实现占用12个字节(在32位系统上)。你不会比这更少。
答案 1 :(得分:0)
感谢所有人,良好的投入。我终于把它修剪成以下内容:
1 - 以下是持有我信息的班级:这里有填充的任何建议吗?看起来没错,因为float = 32bits,+ 16 + 16 + 8 + 8 + 8. 我是否正确假设我可以在这里添加另一个8位元素而不会导致使用额外的内存,因为它无论如何都会填充32位块? / b>
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,每个单元格都有一个指向我的metrics class(1)的指针,因此大小为[rows * cols]:@MattPhillips我将研究使用STD容器和@Angew可能是forward_lists而不是QList < / p>
typedef QList< WFM >* metricsP;
metricsP *mappedMetrics;
mappedMetrics = new metricsP[rows*cols];
这应该减少它。我稍后会添加一些基准测试。
感谢大家的时间,感谢您!
欢迎任何其他意见。
Francesco
答案 2 :(得分:0)
从基准测试中我发现了QList&lt; WFM *&gt;优于QList&lt; WFM&gt;。
为什么
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);
???? 也许我错过了什么。