Во время создания еще одной системы ECS - по сути, просто большой общей структуры данных структуры массива - я столкнулся со странной проблемой, ограничивающей в основном MSVC. Кажется, что массивы фиксированного размера (std::array
или просто обычные массивы), хранящиеся в кортежах, приводят к тому, что компилятору не хватает места в куче (Ошибка MSVC C1060
). Примеры, которые я собрал, будут строить в GCC и Clang, хотя я заметил, что даже в таких ситуациях чем больше массив, тем медленнее сборка. Простой класс, в котором есть только пара массивов, не представляет проблемы.
Пример кода для воспроизведения этого кода:
#include <array>
#include <memory>
constexpr size_t count = 10'000'000;
#define OPTION 2
class holder
{
#if OPTION == 0
std::array<int, count> arr1;
std::array<int, count> arr2;
#endif
#if OPTION == 1
int arr1[count];
int arr2[count];
#endif
#if OPTION == 2
std::tuple<
std::array<int, count>,
std::array<int, count>>
t;
#endif
#if OPTION == 3
std::tuple<
int[count],
int[count]>
t;
#endif
};
int main()
{
auto ptr = std::make_unique<holder>();
}
Пример сбоя компилятора можно увидеть в проводнике компилятора здесь . Веб-сайт не сообщает о фактической ошибке, но ее можно увидеть, если она встроена локально в MSVC.
Главным образом мне любопытно, что здесь происходит с кортежами / массивами, которые приводят к увеличению времени компиляции и увеличению потребления ресурсов с размером фиксированного массива. Почему только когда они встроены в кортеж? Есть ли что-нибудь, что я могу сделать на практике, чтобы ослабить это ограничение (кроме очевидного, не помещайте большие массивы фиксированного размера в кортежи)?
Обратите внимание, что это в C ++ 17, хотя у меня нет реальных ограничений на язык или современные версии компилятора.