c++轻可追加数组容器

c++ light appendable array container

本文关键字:数组 追加 c++      更新时间:2023-10-16

这与我之前在Qt容器的大小上问的另一个问题有关:QMap比Qlist大得多吗?

基本上我真的想重新实现一个非常轻的容器,允许添加项目(不管是否在结束或开始-不,他们不必在内存中连续…非常像列表)。不需要其他函数,只需要追加一个"count()"或"size()"函数来返回容器中的元素数量,这样我就可以遍历每个元素。

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

有人提出过这样的挑战吗?我环顾了一下网络,发现大多数重新实现了STL容器,这对我来说仍然太大了。我现在遵循的想法是重写最简单的(forward_list) STL容器,但我不是功夫,但我会尝试。
感谢您的宝贵时间。
Francesco

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

感谢大家,这里有很好的输入。我最终将其精简为以下内容:

1 -下面是类持有我的信息:有什么建议填充这里?float=32位,+ 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)的每个单元格的指针,因此大小为[rows*cols]: @MattPhillips我将考虑使用STD容器和@Angew可能是forward_lists而不是QList

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

这应该会减少它。稍后我将添加一些基准测试。
感谢大家的时间,谢谢!



Francesco

从基准测试中,我不知怎么发现QList<WFM*>优于QList

为什么

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

? ?也许我遗漏了什么。