我想出的问题的最小例子如下:
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();
按预期工作.