【问题标题】:C++11 subobject alignmentC++11 子对象对齐
【发布时间】:2014-01-02 04:59:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你是说对象类型的要求只适用于完整对象吗?如果是这样,为什么不说“完整的对象”?我采用“该类型的每个对象”来包含子对象。
      • @user3152450:子对象不是“那种类型”
      猜你喜欢
      • 2014-05-03
      • 2018-11-01
      • 2020-08-02
      • 1970-01-01
      • 2011-12-26
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多