在添加元素时使向量更有效

时间:2014-06-20 07:51:05

标签: c++ vector processing-efficiency

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

假设它是针对某些通用数据类型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做到了....

所以它降低了复制所有元素的成本......如果数据很大,那么这可以产生显着的差异...... !!

请告诉我,如果我走在正确的轨道上......

1 个答案:

答案 0 :(得分:2)

我理解你的想法

  

如果new给了我一个与MyVector对象已经拥有的内存相邻的地址,我将在没有重新分配的情况下使用它。

是的,这确实可以在理论上发挥作用。然而,在实践中,不可能获得这样的连续地址,因为分配器很可能在它分配的块的开始处存储一些内部数据(例如它的大小,或指向下一个块的指针,或者其他)。

确切的细节取决于标准库(以及eventuall OS)使用的分配器,但这是典型行为的示例。您拨打new T sizeof(T)为16(例如)。 operator new在内部调用malloc,调用操作系统的分配功能。该函数在地址X分配20个字节的内存。它在X的前4个字节中存储“16”,并将地址X + 4返回到malloc,后者又将其返回到operator new并返回到您的应用程序。所以你无法获得连续的记忆。