msvc2013 无法编译 header 包含大量查找的文件 table
msvc2013 can't compile header file containing huge lookup table
我有一个 header-only 库,其中包含大量 look-up table(超过一百万双)。 look-uptable定义为:
#ifndef EGM96LUT_h__
#define EGM96LUT_h__
#include <vector>
namespace coord
{
const std::vector<std::vector<double>> EGM96LUT = {{...},{...},...};
}
#endif
当我尝试编译包含此 header 和 visual studio 的内容时,它会挂起很长时间然后崩溃。我可以在大约 10 秒内在 gcc 中构建相同的代码。
我知道如果我在 .cpp 文件中静态编译 LUT 可能会起作用,但我真的不想破坏 header-only-ness图书馆的。我也知道我可以将数据存储在某种类型的 .dat 文件中并从磁盘读取它,但我也试图避免这种情况并保持所有内容的编译。
是否有可能有助于缩短构建时间但不使用 .cpp 的解决方法?
我最初使用矢量,所以 LUT 是 heap-allocated,因为我担心可能会溢出堆栈。将向量重构为 const 数组解决了问题,并且没有溢出。
const double EGM96LUT[721][1441] = {{...},{...},...};
你总是可以打破它。一次生成一个内部向量(使用您最喜欢的脚本语言生成此长文本),然后将它们存储在外部向量中。
因为根据您的描述,是解析器崩溃了,这将解决它,因为它会减少咀嚼的时间。
改成
或许也行
const std::vector<const std::vector<double> >
因为这确实是二维数组存储的内容。
我有一个 header-only 库,其中包含大量 look-up table(超过一百万双)。 look-uptable定义为:
#ifndef EGM96LUT_h__
#define EGM96LUT_h__
#include <vector>
namespace coord
{
const std::vector<std::vector<double>> EGM96LUT = {{...},{...},...};
}
#endif
当我尝试编译包含此 header 和 visual studio 的内容时,它会挂起很长时间然后崩溃。我可以在大约 10 秒内在 gcc 中构建相同的代码。
我知道如果我在 .cpp 文件中静态编译 LUT 可能会起作用,但我真的不想破坏 header-only-ness图书馆的。我也知道我可以将数据存储在某种类型的 .dat 文件中并从磁盘读取它,但我也试图避免这种情况并保持所有内容的编译。
是否有可能有助于缩短构建时间但不使用 .cpp 的解决方法?
我最初使用矢量,所以 LUT 是 heap-allocated,因为我担心可能会溢出堆栈。将向量重构为 const 数组解决了问题,并且没有溢出。
const double EGM96LUT[721][1441] = {{...},{...},...};
你总是可以打破它。一次生成一个内部向量(使用您最喜欢的脚本语言生成此长文本),然后将它们存储在外部向量中。
因为根据您的描述,是解析器崩溃了,这将解决它,因为它会减少咀嚼的时间。
改成
或许也行const std::vector<const std::vector<double> >
因为这确实是二维数组存储的内容。