我提出的问题的最小实例如下:
struct __attribute__((aligned(16))) Foo {
float x, y, z;
Foo(float x, float y, float z) : x(x), y(y), z(z) {}
};
class Bar {
public:
Foo foo;
Bar(const Foo &foo) : foo(foo) {}
Foo bar() { return foo; }
};
int main()
{
Bar *bar = new Bar(Foo(0.0f, 0.0f, 0.0f));
bar->bar();
return 0;
}
如果使用clang++
(版本3.4,Ubuntu 14.04中提供的默认版本)进行编译,则此代码会在运行时导致分段错误。使用g++
(版本4.8.4)编译时,不会发生此问题。这是编译器错误还是我的代码有问题?
作为旁注:如果bar
是堆栈分配的,程序不会崩溃,即:
Bar bar(Foo(0.0f, 0.0f, 0.0f));
bar.bar();
按预期工作。
答案 0 :(得分:0)
我猜这个基于堆栈的版本运气好了。在指令之前添加U8会使堆栈不同,因此您可以对其进行测试。 当你把它放在堆上它随机:-) 您可能在代码生成中遇到错误,因为可能您的32位值已在16位边界上对齐,并且已生成用于未对齐访问的代码。 X86会静默处理此异常,但不会处理浮动。这也值得尝试 - 改变整体。