在创建另一个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下。