私は構造体Baseから継承する構造体Xを持っています。アライメントに、Xのサイズは24Bですが、私の現在の設定では、:アンワインドによる継承は厳密なエイリアシングルールに違反していますか?
typedef struct {
double_t a;
int8_t b;
} Base;
typedef struct {
Base base;
int8_t c;
} X;
メモリを節約するために、私は、基本構造体をほどくしたいと思いますので、私はからフィールドを含む構造体Yを作成しましたベース(同じ順序で、常に構造体の先頭)、構造体のサイズは16Bですので:
typedef struct {
double_t base_a;
int8_t base_b;
int8_t c;
} Y;
その後、私はポインタを期待する方法で構造体Yのインスタンスを使用するつもりですベース構造体:
void print_base(Base* b)
{
printf("%f %d\n", b->a, b->b);
}
// ...
Y data;
print_base((Base*)&data);
上記のコードは厳密なエイリアシング規則に違反し、未定義の動作を引き起こしますか?
右は、なぜあなたは、単に基本ベース'宣言しないコード例 –
を固定します); '?他の構造体のstructのメンバと同じメモリを消費します。 – mch
@mchはありません。あなたのアプローチを使用する構造体Xのサイズは24バイトをとりますが、構造体Yのみ16 –