0

さまざまなタイプの複数の POD 構造体で構成される状態変数を 1 つのメモリ領域に格納したいと考えています。状態変数を構成する構造体の組み合わせは実行時に決まるため、単に周囲の構造体やクラスに配置することはできません。また、メモリ割り当ての数をできるだけ少なくしたいと考えています。それを行う最良の方法は何ですか?次のコードは合法/移植可能ですか、それとも一部のプラットフォーム/一部のコンパイラでアライメントエラーを引き起こす可能性がありますか?

struct TestA {
    int a;
    short b;
};

struct TestB {
    int c;
    float d;
    char e;
};

int main() {
    void* mem = new uint8_t[sizeof(TestA) + sizeof(TestB)];
    TestA* a1 = (TestA*) mem;
    a1->a = a1->b = 42;
    a1++;
    TestB* b = (TestB*) a1;
    b->c = 5;
    b->d = 23.f;
    b->e = 'e';
}
4

1 に答える 1

3

あなたがやろうとしているのは、本質的に「新しい配置」です。したがって、すべての警告がここにも当てはまります。メモリの場所が特定のタイプに対して適切に調整されていない場合は、未定義の動作になります。あなたのコードでは:

a1++;

に適切に配置されたアドレスを提供することは保証されていませんTestB。したがって、コードは標準に準拠していません。

于 2012-11-25T11:56:25.250 に答える