文件大小适中的构建挂起
Posted
技术标签:
【中文标题】文件大小适中的构建挂起【英文标题】:Build hangs with an even modest filesize 【发布时间】:2020-06-25 18:36:50 【问题描述】:我有一个 C++ 程序,它带有一个存储在头文件中的大向量。
这个向量的大小约为 100 万个浮点数。 (大约 5MB 文件大小)。我无法在 Visual Studio 中构建此程序。构建文件由 cmake 生成。
如果我用一个较小的向量(比如 100)替换这个向量,我的程序在几分钟内就可以构建好。但是即使有 50 万个点,即使放置几个小时,程序也无法构建。
我的问题,我如何让程序用我的 5MB 文件构建。 MS Visual Studio 是否对文件大小或堆大小有任何限制?在 Linux 上,我可以在大约 5 分钟的时间内完成该程序。但是 Visual Studio 没有运气。
有些地方建议使用这个环境变量。
CL = /Zm50
我尝试了各种数字,但没有任何区别。
Visual Studio 没有提供任何细节 - 构建只是卡在大文件上并且无法完成。我希望有 Visual Studio 经验的人可以就可能的构建选项提供一些见解。
【问题讨论】:
听起来您正在使用编译器对数组进行编译时计算。也许不这样做? 不确定,抱歉! 您能否将其更改为使用static const float data[] = ...; std::vector<float> bigvec = std::begin(data), std::end(data);
之类的内容,将该代码放入 .cpp 文件(而不是包含在多个文件中的 .h)中?
所以向量实际上有一个 5MB(大约)的初始化列表?
值得将您正在做的事情的一个简短版本与“这不足以导致问题”警告一起放入问题中。这增加了很多清晰的问题,即使它是不可重现的。
【参考方案1】:
由于您已在 cmets 中指出您正在使用带有初始化程序的 std::vector<float>
,您可以将其替换为静态数组:
static const float data[] = ...;
std::vector<float> bigvec std::begin(data), std::end(data);
您在 .cpp 文件中声明一次。
静态数组可以在编译时完全构建,不需要任何代码生成。在源文件中定义它(而不是可以包含多次的标头)将避免链接器处理大量重复的代码和/或数据(以及可能违反一个定义规则)。
【讨论】:
以上是关于文件大小适中的构建挂起的主要内容,如果未能解决你的问题,请参考以下文章
如何减少 Flutter 中 IOS 构建的 .ipa 文件大小?
构建 aab 时的文件大小 (mb) 比在 android 中使用 apk 构建时更大