Idea C++ auto unity build system,它能用吗?
Idea C++ auto unity build system, would it work?
所以这听起来有点疯狂,但我有以下想法...
在 c++ 中,当您使用 #include 将所有代码放入一个文件中或简单地复制和粘贴时,它们称为统一构建。这允许闪电般的快速编译。
现在为简单起见,假设我们有一个仅 header 的库,并且我们将自己限制为仅使用 类(这样我们就有了一个 garaunteed 命名空间)。
现在我想知道如果自动进行,效果如何。 script/tool 将用于预处理 .h 文件;挑选包含和依赖项。该工具将递归地遍历每个 .h 文件并构建包含依赖项的映射。然后它会使用#includes 将这些依赖项放在一个文件 (main.cpp) 中并编译。
现在我想听听你们对这个自动统一构建创建器的想法的看法。这样做聪明吗?它会像我预期的那样工作吗?
你有什么成就?
你讨厌 "header only" 因为你“每次都需要重新编译世界”。在您的 "brave new world" 中只有 1 个文件,因此每次都会编译它 - 无论如何。
人们花费了大量的时间和精力来制作 C++,以便它可以使用库等来帮助加快编译速度。哦,对了,我今天看的这个系统有1700万+行代码。你想把它放在一个文件中吗?
OP在评论中提供的链接是一个很好的解释。我看到的最大问题是可扩展性。它确实让我想起了我(继承的)代码库中的一个区域,其中守卫在包含之外以避免打开文件。例如
#ifndef BLAH_H
#include <blah.h>
#endif
Unity 构建被高估了,真的。
This allows for lightning fast compilation.
如今情况并非如此。编译不受 I/O 限制,前提是您有专门的机器用于编译并具有足够的 RAM。每个现代操作系统都会在第一次读取后缓存文件,然后从内存中获取它们。您可以通过管道传输或将它们存储在 RAM 驱动器中来避免中间文件。所以预处理器的工作大部分时间只是连接文件。这很快。实际时间花费在编译和 linking.
因此,任何拥有数千个文件的严肃应用程序都将是巨大的。真实世界的例子——我们使用应用程序,其中源代码需要超过 100MB 的数据(没有系统和第 3 方包括)。因此,您的系统必须对大约 150MB 的文件进行操作。如果某些编译器拒绝编译它,我不会感到惊讶。更不用说编译时间了。拆分成较小的文件并并行编译会更好。又是一个真实的例子——单线程编译需要 40 分钟才能完成,运行 在一台有 16 个线程的服务器上大约需要 2.5-3 分钟,在 16 台服务器上编译,每台服务器有 16 个内核,distcc 需要 30 秒加上一些时间 link.
当 LTO 和静态构建完成时,统一构建的另一个好处是更好的优化消失了。
回答您的问题 - 是的,您可以做到。是否有意义?疑。
所以这听起来有点疯狂,但我有以下想法...
在 c++ 中,当您使用 #include 将所有代码放入一个文件中或简单地复制和粘贴时,它们称为统一构建。这允许闪电般的快速编译。
现在为简单起见,假设我们有一个仅 header 的库,并且我们将自己限制为仅使用 类(这样我们就有了一个 garaunteed 命名空间)。 现在我想知道如果自动进行,效果如何。 script/tool 将用于预处理 .h 文件;挑选包含和依赖项。该工具将递归地遍历每个 .h 文件并构建包含依赖项的映射。然后它会使用#includes 将这些依赖项放在一个文件 (main.cpp) 中并编译。
现在我想听听你们对这个自动统一构建创建器的想法的看法。这样做聪明吗?它会像我预期的那样工作吗?
你有什么成就?
你讨厌 "header only" 因为你“每次都需要重新编译世界”。在您的 "brave new world" 中只有 1 个文件,因此每次都会编译它 - 无论如何。
人们花费了大量的时间和精力来制作 C++,以便它可以使用库等来帮助加快编译速度。哦,对了,我今天看的这个系统有1700万+行代码。你想把它放在一个文件中吗?
OP在评论中提供的链接是一个很好的解释。我看到的最大问题是可扩展性。它确实让我想起了我(继承的)代码库中的一个区域,其中守卫在包含之外以避免打开文件。例如
#ifndef BLAH_H
#include <blah.h>
#endif
Unity 构建被高估了,真的。
This allows for lightning fast compilation.
如今情况并非如此。编译不受 I/O 限制,前提是您有专门的机器用于编译并具有足够的 RAM。每个现代操作系统都会在第一次读取后缓存文件,然后从内存中获取它们。您可以通过管道传输或将它们存储在 RAM 驱动器中来避免中间文件。所以预处理器的工作大部分时间只是连接文件。这很快。实际时间花费在编译和 linking.
因此,任何拥有数千个文件的严肃应用程序都将是巨大的。真实世界的例子——我们使用应用程序,其中源代码需要超过 100MB 的数据(没有系统和第 3 方包括)。因此,您的系统必须对大约 150MB 的文件进行操作。如果某些编译器拒绝编译它,我不会感到惊讶。更不用说编译时间了。拆分成较小的文件并并行编译会更好。又是一个真实的例子——单线程编译需要 40 分钟才能完成,运行 在一台有 16 个线程的服务器上大约需要 2.5-3 分钟,在 16 台服务器上编译,每台服务器有 16 个内核,distcc 需要 30 秒加上一些时间 link.
当 LTO 和静态构建完成时,统一构建的另一个好处是更好的优化消失了。
回答您的问题 - 是的,您可以做到。是否有意义?疑。