Как избежать "предела компилятора: переполнение стека компилятора" с большими векторами?

В моих модульных тестах я получаю следующую ошибку компилятора:

 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.

Ответ 1

Попробуйте помещать данные в const-массив, а затем используйте векторный диапазон ctor:

std::vector<unsigned char> GetTestData()
{
    static const unsigned char data[] = { 
        0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0,
             ...
    }; // Very large 500kb of data

    return std::vector<unsigned char>(data, data + sizeof(data));
}

EDIT: Спасибо Лундину за указание на const.

Ответ 2

Попробуйте создать большой массив для инициализации, а не напрямую использовать инициализатор.

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));
}

Ответ 3

Даже если он строит отлично в 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;
    }