4

複数のキューに使用されるメモリ領域があります。たとえば、1024 バイトのメモリを割り当て、2 つのキューが必要だとします。最初のキューは最初の 512 バイトを占有し、2 番目のキューは次の 512 バイトを占有します。

ただし、私のキューは C++ クラスで表されます。配置の新しい演算子を使用して、各キュー オブジェクトをどのように構築できますか。次のアプローチは正しいですか?

Queue *q1, *q2;
void *mem = malloc( 1024 );

*q1 = new (mem) Queue;
*q2 = new (mem+512)Queue;
4

4 に答える 4

7

私は次のことをします:

Queue* mem = static_cast<Queue*>(malloc(2 * sizeof(Queue));
Queue* q1 = new (mem) Queue;
Queue* q2 = new (mem+1) Queue;

2 つのキューが互いに正確に 512 バイト離れていることが重要な場合、元の提案はほぼ正しいです。

char* mem = static_cast<char*>(malloc(1024));
Queue* q1 = new (mem) Queue;
Queue* q2 = new (mem+512) Queue;

これは、 を想定してsizeof(Queue) <= 512います。へのキャストの理由は、C++ ではchar*ポインター演算が違法であるためです。void*

于 2012-04-12T09:48:30.993 に答える
0

これは私には非常に奇妙に見えます。このようにする理由がわかりません。「mem」を無料で保存する必要があります

一度に 2 つの Queue が必要な場合は、このようにします

class DoubleQueue {
   public Queue q1;
   public Queue q2;
}

...
DoubleQueue dq = new DoubleQueue;

または

Queue queue [] = new Queue [2];
于 2012-04-12T09:56:38.213 に答える
0

sizeof( Queue ) == 512 でない限り、非常に特殊な実装がない限り、おそらくそうではありませんが、あなたのアプローチは機能しません。代わりに、malloc によって指定されたメモリ スライスに実際のノードが割り当てられていることを確認する必要があります。配置の新しい使用に関しては、メモリの配置に関する潜在的な問題を差し控えることはありません。

 char* mem = static_cast< char* >( malloc( 1024 ) );
 Queue* q1 = new ( mem ) Queue;
 Queue* q1 = new ( mem + 512 ) Queue;
于 2012-04-12T09:53:33.473 に答える
0

両方の代入演算子の左辺に初期化されていないポインターのポインター逆参照があるようです。そのため、アドレスを値に代入しようとします。

私にとって、このコードは、Queue クラスがデータ チャンクの上にあり、それについて何も知らないことを意味します (メモリ チャンク サイズを示す Ctor 引数はありません)。Queue オブジェクトにメモリ チャンクへのポインタとその Ctor へのチャンク サイズを与える方が便利でしょうか?

于 2012-04-12T10:03:59.647 に答える