C++ 小C++;容器

C++ 小C++;容器,c++,memory,C++,Memory,简短的故事:我需要一个容器,可以存储无限数量的元素,但不动态内存分配为少数元素 长话短说:我需要存储两个整数,它们的数目没有边界,但很少超过两三个。我尝试使用向量或列表,但与简单阵列相比,性能在发布模式下至少差50倍,在调试模式下差500倍。例如,我测量了创建一个向量,调用push_back三次,然后再次销毁它。这大约需要250纳秒。预先调用reserve(3)会有所帮助,时间会下降到100ns。相反,使用数组需要3个,但我不能使用固定大小的数组,因为元素的数量是无限的。我需要存储很多这些东西,

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

长话短说:我需要存储两个整数,它们的数目没有边界,但很少超过两三个。我尝试使用
向量
列表
,但与简单阵列相比,性能在发布模式下至少差50倍,在调试模式下差500倍。例如,我测量了创建一个
向量
,调用
push_back
三次,然后再次销毁它。这大约需要250纳秒。预先调用
reserve(3)
会有所帮助,时间会下降到100ns。相反,使用数组需要3个,但我不能使用固定大小的数组,因为元素的数量是无限的。我需要存储很多这些东西,作为更大对象的一部分

所以我想我要的是一个使用某种小型向量优化的容器:只要元素的数量很小,它们就存储在对象本身中,并且只有当它增长超过一定限制时,它才会在堆上分配内存。这样的事情存在吗

作为一个侧节点,
basic\u string
已知具有这种优化,因此我尝试了
basic\u string
。事实上,对于3的大小,它的速度是向量的四倍,但不知何故,使用字符串类来存储整数并不合适。所以,我的问题是:是否有一些容器可以很好地用于小尺寸,但如果需要,可以无限增长

编辑人们询问实际代码。嗯,这没什么特别的,它是严格的。我不能发布它,因为它是大型基准测试环境的一部分,有专门用于计时的类,还有一些用于混淆代码的类,以防止编译器将其替换为
{}
。你知道,当它注意到结果没有被使用时,它就会这样做。其核心是:

vector<int> v;
v.push_back(17);
v.push_back(19);
v.push_back(23);
每一个都是在一个紧密的时间循环中运行的

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


Edit3人们一直怀疑我的数字。你为什么认为他们不合理?
vector
执行动态内存分配,而数组不执行动态内存分配,这似乎是对差异的一个很好的解释,不是吗?

您可以显示基准测试的代码吗?您的测试方法听起来有些可疑。您无法以250 ns的精度进行测量,更不用说3 ns了。您测量的数字完全是随机的。您应该详细说明您的用例,对于大多数应用程序来说,100ns的开销可能完全可以忽略不计。此外,我很好奇:你怎么能以纳秒的精度进行基准测试?实时内核?你有没有在相当多的时间里计算平均值和标准差?它是一个微型基准吗?代码分析?否则这些数字都是垃圾…@Konrad当然我没有测量过运行它一次,而是在一个循环中运行了很多次。循环开销仅为两条机器指令,小于1ns。
int x[3];
int k = 0;
x[k++] = 17;
x[k++] = 19;
x[k++] = 23;