如何避免使用大向量的“编译器限制:编译器堆栈溢出”?

时间:2015-06-24 14:10:53

标签: c++ visual-c++

在我的单元测试中,我收到以下编译器错误:

 The error message indicates as follows: 
 'fatal error C1063: compiler limit: compiler stack overflow'

这是由一些包含以下内容的生成标头引起的:

std::vector<unsigned char> GetTestData()
{
     return { 0x1, 0x2, 0x3 }; // Very large 500kb of data
}

如何在不崩溃MSVC的情况下以这种方式使用向量?请注意,代码在clang和gcc中构建正常。

3 个答案:

答案 0 :(得分:5)

尝试将数据放入const静态数组中,然后使用vector的范围ctor:

ApplicationGroupContainerIdentifier

编辑:感谢Lundin指出const。

答案 1 :(得分:1)

尝试构建一个大型数组进行初始化,而不是直接使用初始化程序。

std::vector<unsigned char> GetTestData()
{
     static const unsigned char init[] = { 0x1, 0x2, 0x3 }; // Very large 500kb of data
     return std::vector<unsigned char>(std::begin(init), std::end(init));
}

答案 2 :(得分:-1)

即使它在clang和gcc中构建得很好,我也不建议按值返回这样的大型向量。如果您正在处理的数据是不可变的,我会将其作为const引用返回,如:

// EDIT Moved vector outside of function
static const std::vector<unsigned char> static_v({ 0x1, 0x2, 0x3 });
    const std::vector<unsigned char> & GetTestData()
    {
    return static_v;
    }