这是我创建的用于存储随机数据量的数据类型。 我已经测试了对象并存储了数据并且能够接收它 (我遗漏了接收数据的函数,因为我认为这与函数无关)
class MyDynamicArrayV2
{
int* data;
int* tempArray;
int Position;
int Capacity;
void resize (int desiredSize)
{
delete data;
data = new int [desiredSize];
}
void copy (int* OrginalData,int* dataCopy, int OrginalData_length)
{
for (int i = 0; i < OrginalData_length; i++)
{
*(dataCopy+i) = *(OrginalData+i);
}
}
public :
MyDynamicArrayV2 ()
{
data = new int [2];
Position = 0;
Capacity = 2;
}
void AddData (double Num)
{
if ((Position+1)>Capacity)
{
tempArray = new int [(Capacity)+1]; //
copy(data,tempArray,Capacity); // Copy data to tempeoary storage
resize(Capacity*2);// Resizes the array
copy(tempArray,data,Capacity); // Restore data
Capacity= Capacity*2;
delete tempArray;
}
*(data+Position) = Num; // Allocates the data
Position++;
}
~MyDynamicArrayV2()
{
delete data;
}
};
然后我针对Vector测试了MyDynamicArray对象并列出了Container,因为这两者都能够接受随机数量的数据。我使用以下循环测试速度,并使用任务管理器测试内存使用情况。
t1 = clock();
for (int i = 0 ; i <= 10000000; i++)
{
//MyDynamicArray.AddData(i);
//MyVector.push_back(i);
//Mylist.push_back(i);
}
t2 = clock();
double diff = (double)t2-(double)t1;
double seconds = diff/CLOCKS_PER_SEC;
cout << seconds;
结果。 (MyArray:0.473秒,64.6 MB。) (MyVector:3.595秒,46.2 MB) (MyList:16.987秒,537.8 MB(List的目的是什么?))
所以我的问题是Vector类是如何编写的?与Vector对象相比,为什么我的Object在分配数据时更快。为什么vector对象使用的内存少于我的Object?你最好根据情况创建自己的数据类型吗?
旁注:我还测试了我的对象和矢量对象可以访问数据的速度,但它们几乎都是相同的所以我没有添加此测试,如果有人认为它是相关的请注释,我将添加它
答案 0 :(得分:3)
对于初学者来说,代码肯定是错误的:你分配数组但是释放了对象!至少你需要使用delete[] data;
。在使用gcc和clang在MacOS上针对std::vector<double>
测试代码时,std::vector<double>
会一直获胜。
您是否使用优化进行编译?使用调试模式编译通常非常具有欺骗性:因为std::vector<T>
是重要的模板代码,而不是内联代码是非常有害的。您的代码几乎不会调用任何其他函数,即它不会受到例如函数调用开销的影响。由于在调整数组大小时它会继续复制两次,而std::vector<T>
复制/移动一次只有一次,我希望std::vector<T>
更快(在编译优化时适合我)。