私はC++98でスライスアロケータを書いています。アロケータは、次の2つのテンプレートクラスで構成されます。
- 実際のメモリを割り当てる低レベルのアロケータクラス、
char[]
要求されたオブジェクトを適切な長さの配列としてラップする高レベルのアロケータクラス。
アライメントについて以下で行う仮定が正しいかどうか知りたいのですが。
まず、(タイプのT
)オブジェクトの配列内で、各オブジェクトが適切に配置されていると仮定します。標準ではそれについて具体的なことは何も見ていませんが、それは私には合理的な仮定のようです。
を考えると、sizeof(T[n])
返されるサイズには必要なパディングが含まれているはずなので、配列を格納するのに適していT[n]
ます。
次に、18.4.1.1(operator 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 ++標準ではノードメンバーの順序が保証されていないため、リンクリストを手動で実装する必要があると思います。