0

次のコードがあるとします。

struct Base
{
    int x;
    int y;
    void foo();
    virtual unsigned getCrc() = 0;
};

struct Derived1 : public Base
{
    int a;
    int b;
    unsigned getCrc();
};

struct Derived2 : public Base
{
    float a;
    float b;
    unsigned getCrc();
};

それはC ++標準でaあり、メモリ内にbあるべきですか? それとも、継承されたオブジェクトをレイアウトするために最も使用される方法ですか? (つまり、コンパイラのデファクトスタンダード)。xy

つまり、次のことを保証できますか。

Derived1 obj;

    int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base));

EDIT:私の質問は、「メモリレイアウトはいくつかの標準でカバーされていますか? それともコンパイラ依存ですか?コードは説明用です。

4

2 に答える 2

1

あなたの質問への答えは次のとおりです。それらは特定の状況ではコンパイラに依存し、他の状況では依存しません。 内の詳細

クラスからデータを抽出し、それを最小形式に圧縮する必要がある場合は、それらの一連のシリアル化/逆シリアル化メソッドを実装することをお勧めします。c ++が何をするのかを理解しようとしているだけなら、リンクされた質問が大いに役立つはずです。

于 2013-02-10T15:37:08.990 に答える
0

この方が安全だろう

size_t off = offsetof( Derived1, a );
Derived1 obj;

unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);
于 2013-02-10T15:02:45.987 に答える