【问题标题】:compressing trailing padding space in struct composition or inheritance在结构组合或继承中压缩尾随填充空间
【发布时间】:2017-03-09 19:25:22
【问题描述】:

考虑以下代码:

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 的填充空间中,但必须有更好的方法来做到这一点。

可能是编译指示包(但 A 的多个数据成员应该保持对齐而不是压缩)?还是正确放置的对齐?

【问题讨论】:

  • 可以使用编译器特定的编译指示或属性来打包结构,但不能不丢失成员的对齐方式。虽然没有标准的方法。
  • 尝试添加一个空基类:melpon.org/wandbox/permlink/pKXKfaCH9oj90wGY——顺便说一句,我不知道为什么会这样。

标签: c++


【解决方案1】:

替代方法是否符合条件? 像这样:

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

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多