たとえば、私はバイト配列仮想関数を持つ構造体をバイト配列にキャストすることは安全ですか?
uint8_t data[3];
を持つ構造定義
struct Data {
uint8_t data1;
uint16_t data2;
virtual uint8_t getData1() { return data1; }
virtual uint16_t getData2() { return data2; }
}
を持っているが、これを行うには、それが安全である:
Data *d = (Data*)data;
私が読んで、ので、私は求めています仮想関数を持つクラスは 仮想テーブルポインタを格納し、それを定義する標準はありません はstorですオブジェクト内のed。また、私はインスタンス
struct Data2 : Data { uint8_t data3;
virtual uint8_t getData3() { return data3; } }
のために、データを継承した場合のData2 のオブジェクトのメンバ変数が格納されている順序できますか?バイト配列を介してData2構造体をキャストすると、 のdata1、data2、data3の順序になりますか?前もって感謝します。
アラインメントの問題を起こしているので、 'virtual'に関係なく安全ではありません。(' struct data {uint8_t data1; uint16_t data2;} 'はほとんどの場合、サイズは4ではなく3です。 – melpomene
好ましい方法は、バッファから構造体にメンバーを個別に割り当てることです。これにより、アラインメントとエンディアンの問題を処理できます。 –
申し訳ありませんが、ストレージアライメントについて言及していません。 #pragma(pack、1)のようなアライメントマクロを使用しても、構造内の仮想関数で安全に使用できますか? –