返回对齐结构后的分段错误

时间:2015-12-22 17:14:45

标签: c++ segmentation-fault g++ clang

我提出的问题的最小实例如下:

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();

按预期工作。

1 个答案:

答案 0 :(得分:0)

我猜这个基于堆栈的版本运气好了。在指令之前添加U8会使堆栈不同,因此您可以对其进行测试。 当你把它放在堆上它随机:-) 您可能在代码生成中遇到错误,因为可能您的32位值已在16位边界上对齐,并且已生成用于未对齐访问的代码。 X86会静默处理此异常,但不会处理浮动。这也值得尝试 - 改变整体。