代码之家  ›  专栏  ›  技术社区  ›  Charles Eli Cheese

将类与其继承的类对齐?强制所有堆栈对齐?换尺寸?

  •  0
  • Charles Eli Cheese  · 技术社区  · 16 年前

    我希望有一个基类,它指定从它继承的对象的对齐方式。这对于堆来说很好,因为我可以控制如何分配它,以及如何在自定义数组模板中分配它的数组。但是,C++中的类的实际大小根本没有改变。也就是说,如果我对派生类的指针执行指针算术,那么它将跳到错误的位置。这是第一个问题。

    我也可以做一些智能指针,但这也会带来更多的问题。

    如果我只是对齐基类,那么子类也会对齐吗?如果是这样的话,这将解决我的大部分问题,但这似乎是可疑的情况(尽管我会尝试这个)。

    3 回复  |  直到 11 年前
        1
  •  1
  •   Michael Burr    16 年前

    如果基类有一个特定的对齐要求,那么任何派生类都将至少有该对齐要求(由于它们自己的成员,它们可能会得到更严格的对齐要求)。否则,编译器无法保证访问基成员将满足它们的要求。

        2
  •  0
  •   rama-jka toti    16 年前

    因此,虽然编译器支持确实存在差异,可以更改,受到挑战等,但它也可能在其中一个编译器上严重利用不足;这取决于您包含的优化器和类型,当然也取决于矢量器的选择。再说一遍,不清楚你在做什么,有什么用。

    加州的declspec(align(16))和uu属性 ((对齐(16)))用于gcc。如果这有帮助的话,最好让我们知道,在这个例子中,哪些编译器警告或错误是有效的或无效的。出于各种原因,我也会避免使用任何智能指针。

    sizeof在您的问题中表示您还面临变量数组和指针类型方面的挑战,在这种情况下,前者可能会有问题。即使你可以忍受失去复制构造函数和赋值工具,检查机器代码也不会有什么坏处。也就是说,如果出现复杂情况,您需要做的是查看输出,如果是VC++,则切换到Intel以在Windows中获得更好的提示,并尽早测试/compilet和运行时断言/陷阱故障,或者选择任何免费的对象文件分析工具。然后你就可以用一种最理智的方式来处理那些明显有问题的结构,这总是可能的。

        3
  •  0
  •   Peeter Joot    16 年前

    我们在PARISC HPUX上遇到了类似的问题,其中唯一的原子构造是需要16字节对齐的4字节原子清除。

    struct Stupid_HPUX
    {
       int 4byteLockWordInHere[4] ;
    } ;
    

    并在运行时选择正确的一个。对于你的问题,你可以做类似的事情

    union rawMemory
    {
       int blah[(sizeof(yourtype) + 16)/4] ;
       char c[1] ;
    } u ;
    

    然后使用带有运行时确定的地址的placement new来修复所需的位置。