在添加元素的同时提高向量的效率

Making a vector more efficient while adding elements

本文关键字:向量 高向量 效率 添加 元素      更新时间:2023-10-16

我正在考虑提高矢量数据结构的效率。

假设它是针对某个通用数据类型T……那么在向向量添加新元素的同时,当前std::vector所做的是重新分配一个由n+1个元素组成的全新内存块。

我想做什么…

我写了一个小程序:

#include<iostream>
using namespace std;
int main ()
{
    int *i,*j;
    i=new int;
    cout<<i;
    delete i;
    j=new int ;
    cout<<j;
    delete j;
        return 0;
}

两个内存位置相同。。。

现在我想的是,首先我将为以下通用数据类型分配内存:

T *temp=new T;

现在将temp的内存地址与向量的最后一个元素的地址进行比较。。。。如果它们相差sizeof (T),那么我将在那里添加新元素。。。。否则就用std::vector的方式……

因此,它降低了复制所有元素的成本。。。如果数据很大,那么这可能会产生显著的差异。。。。。。!!

请告诉我我是否在正确的轨道上。。。

我把你的想法理解为

如果new给我一个与MyVector对象已经拥有的内存相邻的地址,我将只使用它而不重新分配。

是的,这在理论上确实可行。然而,在实践中,不可能获得这样一个连续的地址,因为分配器很可能会在它分配的块的开头存储一些内部数据(比如它的大小,或者指向下一个块的指针,或者其他什么(。

具体细节取决于标准库(以及事件操作系统(使用的分配器,但这里有一个典型行为的示例。您调用new T,其中sizeof(T)是16(例如(。operator new在内部调用malloc,后者调用操作系统的分配函数。该函数在地址X处分配20个字节的内存。它在X的前4个字节中存储"16",并将地址X + 4返回给malloc,CCD_12又将地址返回给CCD13,然后返回给您的应用程序。所以你不可能得到连续的内存。