【问题标题】:C++ parent class alignmentC++父类对齐
【发布时间】:2011-02-14 14:27:31
【问题描述】:

是否可以指定父类的对齐方式? 例如类似(未编译):

template<size_t n>
class Vector : public boost::array<double,n> __attribute__ ((aligned(16)))
{

谢谢

好吧,我从 cmets 得知这不是一个好方法。 我想我会坚持私有数组的组合/对齐

【问题讨论】:

  • 为什么要这样做? (并且,在这种情况下,您应该使用组合而不是继承)。
  • @James 我现在确实使用合成,但想删除包装器样板。
  • 从长远来看,您真的不想这样做。它现在为您节省了一点打字时间,但代价是如果它被滥用,您的课程就会进入一个充满微妙错误的世界。以这种方式使用继承是一个非常脆弱的设计。至少使用私有继承,stackoverflow.com/questions/656224/… 是如何做到这一点的一个例子。最后,如果你坚持作曲,你会更快乐。

标签: c++ inheritance alignment


【解决方案1】:

我们也不需要在派生类上请求对齐。我们不需要的原因是派生类请求对齐就足够了,并且请求与派生类对齐将导致依赖于派生的基类的布局。

class A : public C __attribute__ ((aligned(16)))
{


class B : public C __attribute__ ((aligned(8)))
{

C 的对齐方式是什么?

【讨论】:

    【解决方案2】:

    GCC 保证第一个基类在派生类布局中的偏移量为零。因此,在这种情况下,对齐派生对象就足够了。

    目前我找不到好的参考,但请参阅 -wABI 下的 here,其中描述了未说明规则的一个例外:如果基数为空,则它可能不在偏移量零处。

    我想如果第一个基础缺少 vtable 但派生对象有 vtable,则会有另一个例外。 array 属于这一类,我会小心的。当然,标准未指定布局:§10/3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2017-11-01
      • 2018-07-05
      • 2019-04-28
      相关资源
      最近更新 更多