小C ++容器

时间:2014-03-22 12:41:51

标签: c++ memory

简短的故事:我需要一个可以存储无限数量元素的容器,但不需要为少量元素分配动态内存。

长篇故事:我需要存储几个整数,其数量不受限制,但很少超过两三个。我尝试使用vector<int>list<int>,但与简单数组相比,性能在发布模式下至少为50,在调试模式下则为500。例如,我测量了创建vector,调用push_back三次,并再次销毁它。这需要大约250ns。提前调用reserve(3)会有所帮助,时间会降至100ns。使用数组需要3ns,但我不能使用固定大小的数组,因为元素的数量是无限的。作为大型物体的一部分,我需要存储很多这些东西。

所以我想我要求的是一个使用某种小矢量优化的容器:只要元素的数量很少,它们就存储在对象本身中,并且只有当它超出了某些限制它在堆上分配内存。这样的事情存在吗?

作为一个副节点,basic_string已知有这种优化,所以我尝试了basic_string<int>。实际上,对于3的大小,它比vector<int>快四倍,但不知何故使用字符串类来存储整数并不是正确的。再说一遍,我的问题是:是否有一些容器在小尺寸上表现良好,但如果需要可以无限增长?

编辑人们要求提供实际代码。嗯,没有什么特别的,它是直截了当的。我不能发布它,因为它是大型基准测试环境的一部分,具有用于计时的特殊用途类,以及用于模糊代码以防止编译器用{}替换它的一些类。你知道,当它注意到结果没有被使用时就会这样做。它的核心归结为:

vector<int> v;
v.push_back(17);
v.push_back(19);
v.push_back(23);

int x[3];
int k = 0;
x[k++] = 17;
x[k++] = 19;
x[k++] = 23;

每个都在紧密的定时循环中运行。

EDIT2 此用例是每个节点上具有可变数量分支的树。所以我实际上需要存储指针而不是整数,但这是32位,所以两者都是相同的大小。这一点很重要,因为树会不断修改。

编辑3 人们不断怀疑我的数字。为什么你认为他们不合理? vector执行动态内存分配,数组没有,这似乎是差异的一个很好的解释,或者不是吗?

0 个答案:

没有答案