【问题标题】:Segfault in Function call函数调用中的段错误
【发布时间】:2014-06-02 22:15:14
【问题描述】:

为什么以下代码在使用 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++ clang++


    【解决方案1】:

    嗯,你在堆栈上分配了两个巨大的数组。最大堆栈大小不是由 C++ 标准定义的(编译器在那里选择自己的限制),但是超过这个最大值,东西就会坏掉。

    应该在堆上分配大数组,这意味着std::vector 是比std::array 更好的选择(尽管如果你真的想动态分配std::array)。而且你当然不应该在没有阅读移动构造函数的情况下从函数返回那个大小的数组。

    【讨论】:

    • 是的,我没有计算尺寸。不知怎的,我脑子里想着它们不到 1MB
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多