功能调用中的Segfault

时间:2014-06-02 22:15:15

标签: c++ clang++

为什么在使用clang(3.4)编译时使用gcc编译时,以下代码运行正常但是段错误。如果删除了明显多余的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();
}

2 个答案:

答案 0 :(得分:3)

好吧,你要在堆栈上分配两个巨大的数组。最大堆栈大小不是由C ++标准定义的(编译器在那里选择它们自己的限制),但是超过那个最大值并且东西会中断。

应该在堆上分配大型数组,这意味着std::vector是比std::array更好的选择(尽管如果你真的想要,你可以动态分配std::array)。你当然不应该从函数返回那个大小的数组,至少不要读取move-constructors。

答案 1 :(得分:0)

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