我正在考虑提高矢量数据结构的效率。
假设它是针对某些通用数据类型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
做到了....
所以它降低了复制所有元素的成本......如果数据很大,那么这可以产生显着的差异...... !!
请告诉我,如果我走在正确的轨道上......
答案 0 :(得分:2)
我理解你的想法
如果
new
给了我一个与MyVector
对象已经拥有的内存相邻的地址,我将在没有重新分配的情况下使用它。
是的,这确实可以在理论上发挥作用。然而,在实践中,不可能获得这样的连续地址,因为分配器很可能在它分配的块的开始处存储一些内部数据(例如它的大小,或指向下一个块的指针,或者其他)。
确切的细节取决于标准库(以及eventuall OS)使用的分配器,但这是典型行为的示例。您拨打new T
sizeof(T)
为16(例如)。 operator new
在内部调用malloc
,调用操作系统的分配功能。该函数在地址X
分配20个字节的内存。它在X
的前4个字节中存储“16”,并将地址X + 4
返回到malloc
,后者又将其返回到operator new
并返回到您的应用程序。所以你无法获得连续的记忆。