相关疑难解决方法(0)

C++中向量的初始容量

什么是capacity()std::vector这是使用默认constuctor产生的?我知道这size()是零.我们可以声明默认构造的向量不会调用堆内存分配吗?

这样就可以使用单个分配创建一个具有任意保留的数组,例如std::vector<int> iv; iv.reserve(2345);.让我们说出于某种原因,我不想size()在2345年开始.

例如,在Linux上(g ++ 4.4.5,内核2.6.32 amd64)

#include <iostream>
#include <vector>

int main()
{
  using namespace std;
  cout << vector<int>().capacity() << "," << vector<int>(10).capacity() << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

印刷0,10.这是规则,还是STL供应商依赖?

c++ memory-management stl vector

77
推荐指数
5
解决办法
5万
查看次数

向量的小字符串优化?

我知道几个(所有?)STL实现实现了一个"小字符串"优化,而不是存储开始,结束和容量的通常3个指针,如果sizeof(字符),字符串将实际字符数据存储在用于指针的内存中<= sizeof(指针).我处于一种情况,我有很多小矢量,元素大小<= sizeof(指针).我不能使用固定大小的数组,因为向量需要能够动态调整大小并且可能会变得非常大.但是,矢量的中值(非平均)大小仅为4-12个字节.所以适应矢量的"小字符串"优化对我来说非常有用.这样的事情存在吗?

我正在考虑通过简单的蛮力将矢量转换为字符串,即为字符串提供矢量接口.好主意?

c++ string stl vector

26
推荐指数
2
解决办法
7373
查看次数

小C++容器

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

长话:我需要存储几个整数,其数量不受限制,但很少超过两三个.我尝试使用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);
Run Code Online (Sandbox Code Playgroud)

int x[3];
int k = 0;
x[k++] = 17;
x[k++] = 19;
x[k++] = 23;
Run Code Online (Sandbox Code Playgroud)

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

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

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

c++ memory

5
推荐指数
0
解决办法
169
查看次数

标签 统计

c++ ×3

stl ×2

vector ×2

memory ×1

memory-management ×1

string ×1