单一来源项目结构有哪些缺点?

2023-11-26

我是目前公司的新人,正在从事由我的直接团队领导编写的项目。该公司通常不使用 C++,但我的同事用 C/C++ 编写了高效的代码。只有我们知道如何用 C++ 编码(我和我的领导,所以没有第三种意见可以涉及)。

在我对这个项目有了足够的了解之后,我意识到整个结构是......special.

它实际上由一个编译单元组成,其中 makefile 将其列为唯一源main.hpp.

然后,该头文件包含该项目组成的所有源文件,因此它看起来像是一个非常大的列表:

#include "foo.cpp"
#include "bar.cpp"

在尝试理解其背后的逻辑时,我意识到这确实适用于这个项目,因为它只是一个接口,每个单元都可以在不访问任何其他单元的情况下进行操作,在某些时候我问他这样做的原因是什么这边走。

我对争论产生了防御性反应

嗯,它正在发挥作用,不是吗?如果您认为这对您更好,您可以自由地按照自己的方式进行。

这就是我现在正在做的事情,仅仅是因为我在思考这个结构时确实遇到了困难。因此,现在我将“通常”结构应用于我现在正在编写的实现,同时仅对整个项目进行强制性更改,以演示我将如何设计它。

我认为存在很多缺点,从通过自己的项目结构混合链接器和编译器作业开始无法很好地服务,直到优化可能会导致冗余或模糊的结果,更不用说项目的干净构建需要大约30分钟,我认为也可能是结构造成的。但我缺乏知识来指出真实的问题,而不仅仅是假设的问题。

正如他的论点“这对我有用,不是吗?”确实如此,我希望能够向他解释为什么这是一个坏主意,而不是成为一个新的挑剔的人。

那么这样的项目结构实际上可能会导致哪些问题呢? 或者我反应过度了,这样的结构完全没问题?


更不用说项目的(干净)构建大约需要 30 分钟

主要缺点是对代码任何部分的更改都需要从头开始重新编译整个程序。如果编译需要一分钟,这可能不会有什么意义,但如果需要 30 分钟,那就会很痛苦;它破坏了进行更改->编译->测试工作流程。

更不用说一个clean项目的构建大约需要 30 分钟

拥有单独的翻译单元实际上通常从头开始编译要慢一些,但您只需要在每个单元发生更改时单独重新编译它们,这是主要优点。当然,通过在所有翻译单元中包含大量且经常变化的标头,很容易错误地破坏这一优势。单独的翻译单元需要小心谨慎才能正确完成。

如今,使用多核 CPU,多个翻译单元允许的并行性可以缓解从头开始构建速度较慢的情况(如果单个翻译单元的大小碰巧达到最佳点,并且有足够的核心,那么这个缺点甚至可以被克服;您需要进行一些彻底的研究才能找到答案)。

另一个潜在的缺点是整个编译过程必须适合内存。仅当内存超过开发人员工作站上的可用内存时,这才会出现问题。

结论:问题在于单一大量源文件方法不能很好地扩展到大型项目。


现在,为了公平起见,谈谈优势

最多的优化可能会导致冗余或模糊的结果

实际上,单个翻译单元比单独的翻译单元更容易优化。这是因为某些优化(特别是内联扩展)无法跨翻译单元进行,因为它们依赖于当前编译的翻译单元中不存在的定义。

由于流行编译器的稳定版本中提供了链接时间优化,因此这种优化优势已被削弱。只要您能够并且愿意使用现代编译器,并启用链接时间优化(默认情况下可能不会启用)


附言。单曲的命名非常不合常规source带有扩展名的文件.hpp.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单一来源项目结构有哪些缺点? 的相关文章

随机推荐

  • Ruby 中重做和重试语句的用途是什么?

    我能想到的唯一用例redo适用于写入套接字或从数据库读取等操作 但如果这些操作失败一次 后续尝试很可能也会失败 所以对我来说这仍然有点毫无意义 至于retry我真的想不出它会有什么用处 这对我来说似乎毫无意义 因为我不知道也不使用 Ruby
  • CanExecuteCommand 对性能有影响吗?

    使用 ICommand 对象的 CanExecuteCommand 对性能有何影响 该方法是否一遍又一遍地执行 我需要迭代大约 200 个对象的集合 根据这些对象决定是否应启用绑定到命令的按钮 CanExecuteCommand 是否会重复
  • 使用 JNA 的 C 回调使 JRE 崩溃

    我在 JNA 中处理回调时遇到问题 我正在尝试使用 C API 它使用回调来处理多个会话事件 登录 注销 连接问题 会话对象 称为sp session 是一个不透明的结构 所有回调都注册在sp session callbacks结构 根据
  • jQuery 分页 + Twitter Bootstrap

    我正在尝试修改 Jquery 分页 基于这个 Jquery 分页教程 demo 与很棒的 twitter bootstrap 一起工作 Twitter Bootstrap 的标准分页设置如下所示 因此这就是分页输出结构的目标 div cla
  • Android Studio 中的 NDK 集成错误

    我正在使用 Android studio 版本 1 3 1 并尝试通过转到 local proprties 并编写 ndk dir 来集成 NDK 但出现此错误 错误 任务 tesstwo compileReleaseNdk 执行失败 错误
  • Android 连续语音识别返回 ERROR_NO_MATCH 太快

    我尝试实现连续语音识别机制 当我开始语音识别时 我在 logcat 中收到以下消息 06 05 12 22 32 892 11753 11753 com aaa bbb D SpeechManager startSpeechRecognit
  • 如何在 Java 中比较字符串?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我一直在使用 我的程序中的运算符来比较到目前为止我的所有字符串 然而 我遇到了一个错误 将其中一个更改为 equals 相反 它修复了该错误 Is 坏的 什么时
  • 如何通过环境在 aurelia 中设置常量

    我希望将我的 API 基本 URL 更改为dev to prod 在 Angular I 用户中使用config json文件 后来使用注入到应用程序中grunt env 如果您使用奥里利亚 CLI 它将生成一个environments你的
  • 如何在代码编辑器中禁用自动完成代码语句?

    每次我打字if然后按空格键 Delphi 完成它if True then和上面一个新的空行 有没有办法去除this 自动完成 功能或至少编辑它以不创建新行 来自工具 选项 编辑器选项 代码洞察菜单中 取消选择代码模板完成下的自动完成复选框
  • 如何以精确的时间(即 10 毫秒)定期运行 Erlang 进程

    我想每 10 毫秒运行一次定期的 erlang 进程 基于挂钟时间 10 毫秒应该尽可能准确 正确的实施方法应该是什么 如果您想要真正可靠和准确的定期过程 您应该依靠实际的挂钟时间使用erlang monotonic time 0 1 如果
  • 如何运行 test/a.py 形式的单元测试?

    是否可以实现一个具有如下文件结构的Python项目 myproj a py b py c py test a py b py c py Note in particular that the test scripts under test
  • Mongodb - 使用 addToSet 的项目计数

    我分组依据organization并使用 addToSet来展现与众不同的machineIds与此相关的organization 我想计算machineIds对于每个organization 然而 下面的代码返回所有的计数machineId
  • flutter查询firestore中的多个集合

    我正在玩 flutter 但我遇到了 firestore 的问题 我无法弄清楚 假设我想检索客户的购买者历史记录 并且我有一个如下所述的 Firestore 因此我有一个 用户 集合 其中包含以下文档user id然后在其中 我有一个 产品
  • Identity 2.1 - 未找到 UserId 但之前可以使用

    该代码之前多次工作 但在 Identity 2 1 中为用户添加几个新属性后 它突然停止工作 尽管在调试器中可以看到 UserId 的值 但我收到了 UserId not found 错误 任何人都知道为什么会突然发生这种情况 至少看到这一
  • 窗口卸载事件的本地存储

    我使用本地存储来存储一些数据 用户发出 ajax 请求来获取信息 我将结果存储在存储中 以便下次他请求相同的信息时 我首先在存储中查看它是否存在 现在我意识到 将数据保存在内存中的对象中 并在需要时循环该数据 而不是循环本地存储 实际上更有
  • Delphi 的 WebSocket 客户端实现

    Delphi 有免费的 WebSocket 客户端实现吗 我只找到了这个 WebSockets Delphi 组件 但它不是免费的 这是我的开源库 https github com andremussche DelphiWebsockets
  • Django 2.1 - 'functools.partial' 对象没有属性 '__name__'

    我最近将 Django 从 2 0 7 升级到 2 1 1 出现了一个新错误 其中出现此错误 functools partial object has no attribute name 我想了解我的修复是否正确以及是什么导致了这个新错误的
  • 对核心数据实体进行排序的最佳方法是什么?

    我有一个完全正常工作的核心数据模型 但是当我使用获取请求返回数据时 它的顺序看似随机 对这些数据进行排序的最佳方法是什么 是使用核心数据模型中的另一个表 然后 查询 第一个表吗 或者是将数据拉入数组中 然后以这种方式排序 我不太确定如何做其
  • ggplot 函数在图例下方添加文本

    在 R 中 我想创建一个函数 它接受 ggplot 对象和一些文本并返回 ggplot 对象 方法是在图例下方添加文本 在图的右侧 同时将图例保留在右侧 myplot ggplot iris aes x Sepal Length y Sep
  • 单一来源项目结构有哪些缺点?

    我是目前公司的新人 正在从事由我的直接团队领导编写的项目 该公司通常不使用 C 但我的同事用 C C 编写了高效的代码 只有我们知道如何用 C 编码 我和我的领导 所以没有第三种意见可以涉及 在我对这个项目有了足够的了解之后 我意识到整个结