-2
の配列:可撓性部材の私は(しかし、C++で)必要なものC++
struct Element{
bool deleted;
T value;
}
struct Chunk{
Chunk* prev;
// other data
Element elements[]; // C99 flexible array member!
static make(std::size_t capacity){
Chunk *chunk = static_cast<Chunk *>(std::malloc(sizeof(Chunk) + sizeof(Element) * capacity));
// init data
return chunk;
}
}
しかし、C++は '柔軟な配列メンバー' はありません。だからこのようなことをした:
struct Element{
bool deleted;
T value;
}
struct alignas(Element) Chunk{ // Chunk is always POD
Chunk* prev;
// other data
Element *elements() {
return static_cast<Element *>(static_cast<void *>(
reinterpret_cast<unsigned char *>(this) + sizeof(Chunk)
));
}
static make(std::size_t capacity){
Chunk *chunk = static_cast<Chunk *>(std::malloc(sizeof(Chunk) + sizeof(Element) * capacity));
// init data
// DO NOT INIT elements here. Will be placement newed' later.
return chunk;
}
}
質問は正しいですか?それともUBの原因ですか?正しく整列していますか?これはElement elements[1]
よりも優れていますか?
P.S. stackoverflowでこの問題にいくつかの回避策がありますが、私はそれらのどれが正しいのかを知りませんでした。
が見えます。 –
@BaummitAugen - thxだが、それはない: – tower120
それでは、私はその質問を理解していない。 –