文件大小适中的构建挂起

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 构建时更大

Android:构建一个 APK 几乎是嵌入视频文件大小的两倍?

如何分析使用 Delphi 构建的 exe 的文件大小?

MySQL Workbench 挂起获取超过一定大小的数据

我想将我的自定义构建 tailwindcss 文件清除到更小的大小