Как избежать "предела компилятора: переполнение стека компилятора" с большими векторами?
В моих модульных тестах я получаю следующую ошибку компилятора:
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;
}