-5

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

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

当 A 是类型时:

T* A

我认为初始化一个指针数组将需要O(1),因为指针是原语,但我加倍检查,上面的代码实际上size多次传递给T. 如果可以通过malloc我缺少的任何一个或某些东西来避免这个问题,那就太好了。

4

4 回答 4

2

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

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

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

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

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

于 2013-01-27T12:29:35.660 回答
1

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

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

T *A = new T[size];

分配你需要的指针数组

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

我正在使用 typedef,以便语法更清晰。

于 2013-01-27T12:31:01.967 回答
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];
于 2013-01-27T12:31:34.990 回答
0

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

于 2013-01-27T12:32:59.993 回答