所以我想实例化一大块对象以获得一些速度,而不是使用new关键字创建每个项目。例如。在c ++中,您将使用以下代码:
ListViewItem[] items = new ListViewItem[1000];
但我无法理解如何在c#中做到这一点。如果我执行上面的代码,我只需要1000个指针。(我猜因为它们是空的)
我的目标是避免不得不拨打新的1000次
编辑: 用c ++制作了一个测试程序,试图用c#来展示我想要实现的目标。
#include "stdafx.h"
#include <vector>
#include <string>
#include <time.h>
#include <iostream>
using namespace std;
class A
{
public:
A()
{
m_pVector = NULL;
}
void setVector(vector<string>* pVector)
{
m_pVector = pVector;
}
void deleteVector()
{
vector<string>* temp = m_pVector;
m_pVector = NULL;
delete temp;
}
private:
vector<string>* m_pVector;
};
int _tmain(int argc, _TCHAR* argv[])
{
int size = 100000;
A* A1s = new A[size]();
A* A2s = new A[size]();
long int start1=0;
long int diff1=0;
long int start2=0;
long int diff2=0;
vector<string>* mVectors = NULL;
for(int c1=0;c1<10;c1++)
{
if(c1>0)
{
vector<string>* temp1 = mVectors;
mVectors = NULL;
delete[] temp1;
for(int i=0;i<size;i++)
{
A2s[i].deleteVector();
}
}
start1 = clock();
mVectors = new vector<string>[size]();
for(int i=0;i<size;i++)
{
A1s[i].setVector(&mVectors[i]);
}
diff1 = clock() - start1;
start2 = clock();
for(int i=0;i<size;i++)
{
A2s[i].setVector(new vector<string>());
}
diff2 = clock() - start2;
cout<<"1:"<<diff1<<" 2:"<<diff2<<" diff:"<<diff2-diff1<<endl;
}
cin.get();
}
因此,创建一个数据块比在每个循环中创建新数据更快。 我想在c#中做同样的事情,但我无法弄清楚如何创建数据块。
答案 0 :(得分:1)
实际上在这个C ++代码中:
ListViewItem[] items = new ListViewItem[1000];
对象构造函数(初始化)将被调用1000
次。
就是这样,有一个隐藏的循环。
唯一的优点是内存分配只进行一次。
C#中没有相同的东西。分配和初始化一起完成,一次完成一个对象,并在您致电new
时完成。
你坚持:
所以使用for-loop来实现它,它是实现它的标准方法:
var items = new ListViewItem[1000];
for (var i = 0; i < items.Length; i++)
{
items[i] = new ListViewItem();
}
您也可以使用linq给您的伴侣留下深刻印象:
var array = new object[1000];
Enumerable.Range(0, array.Length).Select(i => array[i] = new object());