C + 11 [basic.align]说:
对象类型对该类型的每个对象强制执行对齐要求;可以使用对齐指示器
请求更严格的对齐
然后不久给出一个例子:
struct B { long double d; };
struct D : virtual B { char c; }
并说明以下示例:
当D是完整对象的类型时,它将具有B类型的子对象,因此必须针对long double对齐。如果D显示为另一个也具有B作为虚拟基类的对象的子对象,则B子对象可能是不同子对象的一部分,从而降低了对D子对象的对齐要求。
那么对象类型为D的所有对象的对齐要求是什么?我理解D子对象有对象类型D,这将使它受到同样的要求。如果D作为子对象的外观在适用于所有子对象时如何消除这些要求?或者我应该理解这是否意味着完整的D对象对于对象类型强加的对象有进一步的要求,并且当D作为子对象出现时这些要求可能会被削弱?
答案 0 :(得分:0)
这是因为D
是使用虚拟继承从B
派生的。这意味着如果您定义另一个对象类型,派生自D
以及B
(再次虚拟),
struct E : D , virtual B
{ /*...*/ };
然后B
子对象只会出现在E
个对象中,而不是两次。因此,D
对象的E
子对象可能不包含B
子对象,因此享有宽松的对齐要求。 (E
对象作为一个整体仍然需要完全对齐要求。)
答案 1 :(得分:0)
继承以D
为基础的“另一个对象”的假设类仍将具有最严格的对齐要求。它是只是可以放宽的D
子对象,因为B
上下文被带走了。这只是狡辩:没有松动最终的物体。