Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化动态大小向量的向量存储_C++_Caching_Vector - Fatal编程技术网

C++ 优化动态大小向量的向量存储

C++ 优化动态大小向量的向量存储,c++,caching,vector,C++,Caching,Vector,在我正在做的一些工作中,我多次遇到这种问题模式,我想知道是否存在已知的解决方案 很简单:我有一个元素向量,元素向量又是一些动态大小的向量。我知道内部向量的大小相对较小,即在平均情况下,项目的数量约为10秒,但会有很多 我可以天真地解决这个问题: vector<vector<item>> vss; 使用这种方法,内部向量中的内存分配将无处不在。迭代vss中的所有元素将导致缓存混乱,这可能会导致性能问题 我认为这可以用某种链表结构来解决,在同一块内存中有多个磁头 假设无法预

在我正在做的一些工作中,我多次遇到这种问题模式,我想知道是否存在已知的解决方案

很简单:我有一个元素向量,元素向量又是一些动态大小的向量。我知道内部向量的大小相对较小,即在平均情况下,项目的数量约为10秒,但会有很多

我可以天真地解决这个问题:

vector<vector<item>> vss;
使用这种方法,内部向量中的内存分配将无处不在。迭代vss中的所有元素将导致缓存混乱,这可能会导致性能问题

我认为这可以用某种链表结构来解决,在同一块内存中有多个磁头

假设无法预先确定内部向量的大小,是否有一种方法来构造和填充vss,从而使元素上的迭代不会成为缓存灾难


谢谢。

我只想添加当前的解决方案,但希望是临时的。我没有直接填充vss,而是使用一个临时向量对:

向量临时变量


,表示应在特定索引处插入某些项。从这里开始,我计算每个索引的条目数,分配一块内存来保存条目,并移动数据。一些额外的向量用于簿记,即每个索引的项数及其起始位置。

如果您认为这会到处都有内存分配,我可以向您保证,传统的链表不会更好,而且很可能会更糟。现在,您实际上有一个指向动态行的指针表。如果总体池大小大体相同,您可以不用管理自己的分配器,但大多数标准库已经为您进行了子分配,而且效率相当高,因此我看不到巨大的成功。WhozCraig,我意识到使用传统的链表会更糟。我想到的是分配一大块内存,并将链表保留在该块中,必要时重新分配和移动。正是在这一点上,我建议您可以使用自定义分配器并保持布局,以某种透明的方式完成此任务,而是使用std::vector,您的分配器从您自己管理的内存池中提取内存。您可能不需要重新设计太多的轮子。作为WhozCraig的自定义分配器建议的一个半生不熟但可能容易获胜的替代方案,并且取决于很多事情—插入/擦除元素的方式和时间,考虑到向量后填充处理的数量等,是否值得重新打包-可能需要有向量数据和向量索引,这样数据[index[i]+j]就相当于旧的vss[i][j]-您可以轻松创建一个包装类,这样[i][j]符号仍然有效。。。。