考虑以下代码:
struct A {
double d;
float a;
};
static_assert(sizeof(A) == 2 * sizeof(double), "");
struct B : A {
float b;
};
static_assert(sizeof(B) == sizeof(A), ""); //Fails
struct C {
A a;
float b;
};
static_assert(sizeof(C) == sizeof(A), ""); //Fails
是否有一种(最好是便携式)方式来安排b住在A的未使用的尾随填充空间?
我可以通过在末尾添加一个预期数据成员来修改A,或者我可以将b放置到A的填充空间中,但必须有更好的方法来实现。
也许是pragma pack(但A的多个数据成员应该保持对齐而不是压缩)?或者正确放置的对齐?
答案 0 :(得分:0)
替代方法是否合格? 像这样:
struct A {
char buf[100];
float *a() {
return (float *)&buf[0];
}
};
struct B : A {
float *b() {
return (float *)&buf[4];
}
};
static_assert(sizeof(B) == sizeof(A), ""); // should pass