1

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

问题二是堆栈对齐。似乎没有办法直接强制整个堆栈为 16 字节对齐的指针。

我唯一能看到影响这些的是 vc++ 和 g++ 编译器特定设置,但这里的问题是我不想一直手动修复对齐。那肯定容易出错,更不用说痛苦了。

我也可以制作某种智能指针,但这也会引入更多问题。

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

4

3 回答 3

3

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

但是,对于堆栈对齐,您实际上无法进行任何可移植的操作——这完全由编译器和编译器的平台 ABI 要求处理。正如您所指出的,编译器选项或编译指示可能会让您施加一些控制,但没有可移植性。

于 2009-11-07T07:40:24.327 回答
0

关于可移植性,请牢记迈克尔的回答。我假设您的目标是 SSE 矢量化,并且开始感到痛苦,这确实应该是通过显式提示和低级控制来实现它的标准方法。您提到的两个编译器默认情况下都在堆栈上争取 16 字节对齐。

因此,尽管编译器支持确实有所不同,可以更改,受到挑战等,但它也可能在其中一个上被严重利用不足;它取决于您包含的优化器和类型,以及自然的矢量化器选择。再说一次,不清楚您在做什么以及用途是什么。

由于没有示例的问题定义是粗略的,也许您可​​以为加利福尼亚(使用 LTCG)和 __attribute ((aligned (16))) 为 gcc 提供一个镜头。如果这有帮助,最好让我们知道在示例中哪些具体有效或无效,哪些编译器警告或错误也是如此。由于各种原因,我也会避免使用任何智能指针。

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

于 2009-11-07T11:02:31.007 回答
0

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

我们可以通过像这样声明我们的 4 字节数量来伪造它:

结构 Stupid_HPUX
{
   int 4byteLockWordInHere[4] ;
} ;

并选择正确的在运行时使用。对于您的问题,您可以做类似的事情

联合原始内存
{
   int blah[(sizeof(yourtype) + 16)/4] ;
   字符 c[1] ;
} 你;

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

于 2009-11-07T15:07:41.353 回答