C++ 尝试初始化uum128类成员变量时的EXC_u错误访问信号
我使用的是苹果GCC4.2.1,我在下面的代码中遇到了一个奇怪的问题。。。尝试初始化类成员变量时,我总是遇到异常。不幸的是,下面的简化代码在一个测试应用程序中工作,但也许您仍然可以帮助我找到这个问题的根源 我无法理解EXC\u BAD\u ACCESS异常背后的原因-\u m128类型不是指针,所有其他MyClass成员初始化和访问时没有任何问题,没有堆栈/堆损坏的迹象,如果我使用局部变量,那么一切都可以正常工作,并且在MSVC下没有问题。。。也许校准有问题 请帮忙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
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属性
对齐
\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结尾的十六进制地址)。