C ++ 11子对象对齐

时间:2014-01-02 04:59:52

标签: c++ c++11 memory-alignment

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作为子对象出现时这些要求可能会被削弱?

2 个答案:

答案 0 :(得分:0)

这是因为D是使用虚拟继承B派生的。这意味着如果您定义另一个对象类型,派生自D以及B(再次虚拟),

struct E : D , virtual B
{ /*...*/ };

然后B子对象只会出现在E个对象,而不是两次。因此,D对象的E子对象可能不包含B子对象,因此享有宽松的对齐要求。 (E对象作为一个整体仍然需要完全对齐要求。)

答案 1 :(得分:0)

继承以D为基础的“另一个对象”的假设类仍将具有最严格的对齐要求。它是只是可以放宽的D子对象,因为B上下文被带走了。这只是狡辩:没有松动最终的物体。