让我们说,我有我建立一个二进制文件,我有一大堆的是从来没有真正使用的文件,并做后续链接到那些描述的库包括的文件吗? (再次,从未使用这些库)

这有什么负面后果,超越增加编译时间?

有帮助吗?

解决方案

一个少数我能想到的是的命名空间污染和<强>二进制大小

其他提示

在除了编译时间;增加的复杂性,同时调试不必要分心,维护开销。

除此之外,没有什么。

在除了什么萨莎列出为维护成本的。您将能够轻松地检测使用什么,什么是不是将来时,如果你选择了删除未使用的东西吗?

如果从未使用的库,应该有可执行的尺寸没有增加。

根据具体链接,你可能也注意到,您未使用的库的全局对象仍然可以构建。这意味着存储器开销,同时增加启动成本。

如果你包括但不使用库不是在目标系统上,它将无法编译,即使他们是没有必要的。

这里是我的关于C和静态库类似的问题的答案。也许是有用的你在C ++以及上下文

您提到在编译时间的增加。从我了解的库静态链接,而不是动态的。在这种情况下,这取决于链接器如何处理未使用的功能。如果忽略它们,你将有大部分的维修问题。如果他们将被列入,可执行文件的大小会增加。现在,这是比它需要在硬盘上的位置更加显著。大的可执行文件可以运行速度较慢,由于缓存的问题。如果有源代码和非活性代码中的exe是相邻的,它们将被缓存在一起,使得有效地高速缓存更小,更高效。

和VC2005以上具有称为PGO一种优化,哪些订单可执行内的代码中确保的代码有效高速缓存经常使用的一种方法。我不知道如果g ++有一个类似的优化,但它是值得探讨的是,

一点点编译这里的问题,wiki的编辑将其视为必要的:

的主要问题似乎是:的命名空间污染 这可能会导致在未来调试,版本控制问题,并增加了将来的维护成本。

有也将是,在最小,次要的二进制鼓胀症下,作为函数/类/命名空间引用将保持(在符号表?)。动态库不应该大大增加二进制文件的大小(但他们成为二进制运行依赖?)。从GNU C编译器来看,静态链接库不应该被包含在最终的二进制如果他们从来没有在源引用。 (基于C编译器的假设,可能需要澄清的/正确的)

此外,根据您的库,全局和静态对象的性质/变量可以被实例化,造成的增加启动时间和内存开销

喔,和增加编译/联时间。

我发现,当我编辑的源代码树一个文件,因为某些符号是我的工作出现在源文件中(它令人沮丧如函数名,在那里我只是改变了原型 - 或者,可悲的是更通常,刚加入的原型头),所以我需要检查的使用是正确的,否则编译器现在告诉我,使用在该文件不正确。所以,我编辑的文件。然后我看到一个问题 - 什么是这个文件做什么?而事实证明,尽管代码是在产品的“拿来主义”,它真的没有主动使用的。

我发现在星期一这个问题的发生。与10000行的代码的文件调用的函数“的extern空隙add_remainder(空隙);”与0的参数,所以,我去解决它。然后我看着代码的其余部分......事实证明那是约15年前开发存根从来没有被删除。切除干净的代码变成了小修改涉及到超过半一打文件的更多 - 并且我还没有制定出它是否是安全的,在案件枚举的中间取出枚举常量。暂时,被标记。“未使用/废弃 - ?它可以被安全地移除”

的代码块已经具备了在过去15年零海湾覆盖 - 生产,测试,......真实的,它只是一个庞大的系统的一小部分 - 个明智的,它是小于在1%昙花一现图表。尽管如此,它是额外浪费代码。

令人费解。烦人。令人沮丧的是常见的(我已经记录下来,并固定好,今年迄今至少有半打类似的错误)。

和浪费我的时间 - 和其他开发人员的时间。该文件已被其他人在做什么,我在做定期编辑多年来 - 一个彻底的工作

我没有经历过与链接其中仅使用一个非常小的部分的.lib文件的任何问题。只有真的使用的代码会被链接到可执行文件和链接时没有(与Visual Studio)显着增加。

如果您链接到二进制文件,它们在运行时得到加载,他们可以执行不平凡的初始化,可以做任何事情,从分配少量的内存消耗稀缺的资源来改变你的模块的状态的方式,你不期望,超越。

你最好摆脱的东西,你不需要,仅仅是为了消灭一堆未知数。

这可能甚至无法编译,如果构建树没有得到很好的维护。如果傻冒编译嵌入式系统,而无需交换空间。编译器可以同时试图编译一个巨大的对象文件耗尽存储器。

这事发生在工作中我们最近。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top