-5

次のコードでO(1)はなく、メモリ割り当てが行われるため、 malloc を使用したいと思います。O(n)

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

A が型の場合:

T* A

O(1)ポインターはプリミティブであるため、ポインターの配列の初期化には時間がかかると思いましたが、チェックを2回行ったところ、上記のコードは実際sizeにのコンストラクターに数回進みTます。この問題がどちらか、mallocまたは私が見逃している何かによって回避できれば、それは素晴らしいことです。

4

4 に答える 4

2

あなたが正しく指摘しているようにnew T[n]、コンストラクターを呼び出しますが、呼び出しmalloc()ません。

  • コンストラクターを呼び出したくない場合 (なぜですか?)、明らかにnew[]適切ではありません。
  • ただし、コンストラクターを呼び出したい場合は、o(n)複雑さを回避する方法はありません。

探しているものがへのポインターTの配列である場合、正しい構文は次のとおりです。

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

Tこれはのコンストラクターを呼び出しません。

于 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 に答える