Большой массив фиксированного размера внутри std :: tuple исчерпывает кучу компиляторов в MSVC? - PullRequest
0 голосов
/ 19 января 2019

Во время создания еще одной системы 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, хотя у меня нет реальных ограничений на язык или современные версии компилятора.

...