【发布时间】: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++