0

私はC++98でスライスアロケータを書いています。アロケータは、次の2つのテンプレートクラスで構成されます。

  1. 実際のメモリを割り当てる低レベルのアロケータクラス、
  2. char[]要求されたオブジェクトを適切な長さの配列としてラップする高レベルのアロケータクラス。

アライメントについて以下で行う仮定が正しいかどうか知りたいのですが。


まず、(タイプのT)オブジェクトの配列内で、各オブジェクトが適切に配置されていると仮定します。標準ではそれについて具体的なことは何も見ていませんが、それは私には合理的な仮定のようです。

を考えると、sizeof(T[n])返されるサイズには必要なパディングが含まれているはずなので、配列を格納するのに適していT[n]ます。


次に、18.4.1.1operator new)は次のように述べています。

1効果:新しい式(5.3.4)によって呼び出される割り当て関数(3.7.3.1)は、そのサイズのオブジェクトを表すために適切に整列されたストレージのバイトを割り当てます。size

したがって、::operator new(sizeof(T[n]))配列に適切に配置されたメモリブロックを作成する必要があると思いますT[n]


最後に、9.2クラスメンバー)は次のように述べています。

17を使用して適切に変換されたPOD-structオブジェクトへのポインタは、reinterpret_castその最初のメンバー(または、そのメンバーがビットフィールドの場合は、それが存在するユニット)を指し、その逆も同様です。[注:したがって、適切な配置を実現するために必要な場合、POD-structオブジェクト内に名前のないパディングが存在する可能性がありますが、最初は存在しません。]

したがって、私は次のように仮定しstructます:

struct node
{
    char data[sizeof(T[n])];
    node* next;
};

を介して割り当てられるnew nodeと、dataメンバーは配列に対して適切に配置されますT[n]


上記の仮定は正しいですか、それとも私は何かが欠けていますか?C ++標準ではノードメンバーの順序が保証されていないため、リンクリストを手動で実装する必要があると思います。

4

1 に答える 1

1

はい、あなたの仮定は正しいです。私は何かを逃したかもしれませんが、なぜあなたがこのようなものを持てないのかわかりません:

struct node
{
   T[n];
   node* next;
};
于 2012-08-16T21:35:48.663 に答える