C++ 尝试初始化uum128类成员变量时的EXC_u错误访问信号

C++ 尝试初始化uum128类成员变量时的EXC_u错误访问信号,c++,visual-c++,gcc,exc-bad-access,sse,C++,Visual C++,Gcc,Exc Bad Access,Sse,我使用的是苹果GCC4.2.1,我在下面的代码中遇到了一个奇怪的问题。。。尝试初始化类成员变量时,我总是遇到异常。不幸的是,下面的简化代码在一个测试应用程序中工作,但也许您仍然可以帮助我找到这个问题的根源 我无法理解EXC\u BAD\u ACCESS异常背后的原因-\u m128类型不是指针,所有其他MyClass成员初始化和访问时没有任何问题,没有堆栈/堆损坏的迹象,如果我使用局部变量,那么一切都可以正常工作,并且在MSVC下没有问题。。。也许校准有问题 请帮忙 class MyClass

我使用的是苹果GCC4.2.1,我在下面的代码中遇到了一个奇怪的问题。。。尝试初始化类成员变量时,我总是遇到异常。不幸的是,下面的简化代码在一个测试应用程序中工作,但也许您仍然可以帮助我找到这个问题的根源

我无法理解EXC\u BAD\u ACCESS异常背后的原因-\u m128类型不是指针,所有其他MyClass成员初始化和访问时没有任何问题,没有堆栈/堆损坏的迹象,如果我使用局部变量,那么一切都可以正常工作,并且在MSVC下没有问题。。。也许校准有问题

请帮忙

class MyClass
{
    public:
    // lots of members
    __m128 vect;

    MyClass()
    {
        vect = _mm_setr_ps (0.f, 0.f, 0.f, 10.0f); // Program received signal: “EXC_BAD_ACCESS”.
    }

    void iniialize()
    {
        __m128 localVector = _mm_setr_ps (0.f, 0.f, 0.f, 10.0f); // No problems
        vect = localVector; // Program received signal: “EXC_BAD_ACCESS”.
    }
};

在我的脑海里:我会说对齐问题

特别是,上面写着“很多成员”

查看
\uuuu属性
对齐


如果在堆栈上创建对象,gcc将自动正确对齐
\uuuu m128
成员,但对于通过
new
分配的对象,则由内存分配器控制,在Linux上通常只有8字节对齐。您可能需要重写类的运算符
new
,以便它调用,以便始终获得16字节对齐的对象


已经说过,如果您进入SSE代码优化,那么您可能需要重新评估如何编写编码——因为性能通常是SIMD优化的动机,您可能希望在比C++类稍微低的级别上工作——通常您只想在大数据块上均匀地操作,即1D或2D阵列。

如果堆栈未对齐是问题所在,则应检查
-mstackreallign
命令行选项,请参阅。这解决了我在MinGW目标上的问题。另见关于的讨论。最后,您可能希望将GCC更新到一个更新的版本


另一方面,如果动态分配对象,则必须确保内存对齐,如Paul所述。有像
\u mm\u malloc
\u mm\u free
这样的方法可以帮助您做到这一点

Sehe,你证实了我最糟糕的噩梦。。。在MSVC项目中,16字节的对齐是强制的,但我在GCC中找不到这样做的方法,我担心手动将对齐属性添加到数千个源文件中的所有_m128成员及其包装中会导致死亡。。。也许我遗漏了什么,也许还有其他方法?您可以将相同的gcc属性应用于_m128类型。我怀疑这涉及到编辑Windows头文件,但它应该可以工作。我相信谷歌
gcc+“\uuu m128”
会在这里找到比我更好的提示。现在,我认为如果您想输入名称空间,可以键入def,比如
aligned_m128
。您不应该重载保留标识符
\uuum128
,因此您需要使用预处理器宏来避免必须更改代码。我通过将属性应用于整个类来修复此问题,因为仅对\uuuum128成员使用该属性并没有正确对齐它们。谢谢您,Sehe和Paul!但是,指定16字节对齐方式无法解决任何问题:(请告诉我,还有什么可能导致此问题?您是在堆栈上创建类的实例还是通过
new
?如果您使用
new
,那么您是否覆盖它以使用例如
posix_memalign
?在每个vect赋值处设置断点并检查对齐情况(vect成员应具有以0结尾的十六进制地址)。