在c ++中分配指针数组

时间:2013-01-27 12:26:29

标签: c++ performance

我想使用malloc,因为它的内存分配发生在O(1)而不是O(n),代码如下:

MyQuickInitArray(int size)
{
    A = new T[size];
}

当A的类型为:

T* A

我认为初始化一个指针数组将需要O(1),因为指针是基元,但我检查了一倍,上面的代码实际上size次到T的构造函数。如果malloc或者我缺少的东西可以避免这个问题,那么这个问题会很棒。

4 个答案:

答案 0 :(得分:2)

正如您正确指出的那样,new T[n]会调用构造函数,而malloc()则不会。

  • 如果您不想调用构造函数(为什么?),那么显然new[]不适合您。
  • 但是,如果您确实想要调用构造函数,那么就无法绕过o(n)复杂性。

如果您要查找的是指向T 的数组,则正确的语法如下:

T** A = new T*[size];

这不会调用T的构造函数。

答案 1 :(得分:1)

  

我认为初始化一个指针数组将需要O(1)

您没有分配指针数组,而是使用您的代码分配类型为T的对象数组:

T *A = new T[size];

分配你需要的指针数组

typedef T *T_Ptr;
T_Ptr *A = new T_Ptr[size];

我正在使用typedef,因此语法更清晰。

答案 2 :(得分:0)

重载新的

怎么样?
void* class_name::operator new(size_t size)
{
      cout<<"Allocating memory for object \n";
      void *p;
      p=malloc(size);
      if(p==NULL)
      cout<<"Memory allocation error\n\a";
      else
      return p;
      }

对于数组

void* class_name::operator new[](size_t size)
{
      cout<<"Allocating array of size "<<size<<endl;
      void *p;
      p=malloc (size);
      if(p==NULL)
      {
                 cout<<"Memory allocation error \n";
                 }
      return p;
      }

如何使用:

Class_name *objptr1,*objptr2;
objptr1=new class_name(10);
objptr2=new class_name[10];

答案 3 :(得分:0)

如果为对象分配了空间,可以使用C ++的“placement new”运算符正确初始化它们;在这种情况下,new不分配内存,但它会调用构造函数。 http://www.cplusplus.com/forum/general/55150/有一个示例,但通常您不希望这样做,您希望将对象分配到程序的非时间关键部分。