压缩结构组合或继承中的尾随填充空间

时间:2016-10-27 07:48:07

标签: c++

考虑以下代码:

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的多个数据成员应该保持对齐而不是压缩)?或者正确放置的对齐?

1 个答案:

答案 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