函数调用中的段错误

Segfault in Function call

本文关键字:错误 段错误 函数调用      更新时间:2023-10-16

为什么下面的代码在使用gcc编译时运行良好,而在使用clang(3.4)编译时却出现了段错误?如果删除了明显冗余的Thread对象,代码将正常运行。此外,如果任何数组变小,代码运行良好。

#include <array>
#include <emmintrin.h>
class Thread {
public:
    std::array<__m128i,  16 * 3 * 3 * 1280> m_BlockTypes;
    unsigned int  m_SeedIdx1[16 * 16 * 3 * 3 * 512];
};
class BroadcastImpl
{
    public: 
    std::array<__m128i, 16 * 3  * 3 * 256> Evaluate()
    {
        return std::array<__m128i, 16 * 3  * 3 * 256>();
    }
};

int main(int argc, char** argv) {
    Thread thread;
    (void)(thread);
    BroadcastImpl().Evaluate();
    BroadcastImpl().Evaluate();
}

你在堆栈上分配了两个大数组。最大堆栈大小没有由c++标准定义(编译器选择自己的限制),但是超过这个最大值,就会出现问题。

应该在堆上分配大数组,这意味着std::vector是比std::array更好的选择(尽管您可以动态分配std::array,如果您真的想要的话)。在没有阅读move-constructor之前,你当然不应该从函数返回这么大的数组。

这似乎是一个堆栈溢出。我的猜测是clang的默认堆栈大小与g++不同。尝试在两个链接器中手动设置堆栈大小为相同的大小。