std :: tuple中的大型固定大小数组耗尽了MSVC中的编译器堆?

时间:2019-01-19 01:16:11

标签: c++ arrays visual-c++ compiler-errors tuples

在创建另一个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>();
}

可以在编译器资源管理器here中看到编译器失败的示例。该网站未报告实际错误,但可以在MSVC中本地构建。

大多数情况下,我对元组/数组的含义感到好奇,这会导致编译时间和资源消耗随固定数组的大小而增长。为什么只将其嵌入元组中?有什么我可以做的设计实践来减轻这种限制(除了显而易见的是,不要在元组中放入大的固定大小的数组)?

请注意,尽管我对语言或现代编译器版本没有任何实际限制,但这是在C ++ 17下。

0 个答案:

没有答案