C++ 包含和/或链接非';你的二进制文件没有使用它吗?
假设我有一个正在构建的二进制文件,我包含了一堆从未实际使用过的文件,那么后续链接到这些包含文件所描述的库吗?(同样,这些库从未使用过)C++ 包含和/或链接非';你的二进制文件没有使用它吗?,c++,linux,linker,g++,ld,C++,Linux,Linker,G++,Ld,假设我有一个正在构建的二进制文件,我包含了一堆从未实际使用过的文件,那么后续链接到这些包含文件所描述的库吗?(同样,这些库从未使用过) 除了增加编译时间外,这会带来什么负面影响?除了Sasha列出的维护成本之外,我能想到的一些是名称空间污染和二进制大小。当您选择删除未使用的内容时,您是否能够轻松地检测哪些内容已被使用,哪些内容未被使用?除了编译时之外;增加了复杂性,调试时不必要的分心,增加了维护开销 除此之外,什么都没有。如果从未使用过库,则可执行文件的大小不应增加。根据具体的链接器,您可能还会
除了增加编译时间外,这会带来什么负面影响?除了Sasha列出的维护成本之外,我能想到的一些是名称空间污染和二进制大小。当您选择删除未使用的内容时,您是否能够轻松地检测哪些内容已被使用,哪些内容未被使用?除了编译时之外;增加了复杂性,调试时不必要的分心,增加了维护开销
除此之外,什么都没有。如果从未使用过库,则可执行文件的大小不应增加。根据具体的链接器,您可能还会注意到未使用库的全局对象仍然会被构造。这意味着内存开销,并增加启动成本。我从未遇到过链接.lib文件的问题,该文件只使用了很小的一部分。只有真正使用的代码才会链接到可执行文件中,并且链接时间不会显著增加(使用Visual Studio)。如果链接到二进制文件并在运行时加载它们,它们可能会执行非平凡的初始化,这可以做任何事情,从分配少量内存到消耗稀缺资源,再到以您意想不到的方式改变模块的状态
你最好扔掉你不需要的东西,只是为了消除一些未知的东西。如果目标系统上没有你正在使用但没有使用的库,即使它们不是必需的,它也无法编译。是我对一个关于C和静态库的类似问题的回答。在C++上下文中,这可能对你有用。 你提到编译时间的增加。从这一点我了解到这些库是静态链接的,而不是动态链接的。在这种情况下,这取决于链接器如何处理未使用的函数。如果它忽略了它们,您将面临大部分维护问题。如果包含它们,可执行文件的大小将增加。现在,这比它在硬盘上的位置更重要。由于缓存问题,大型可执行文件可能会运行较慢。如果活动代码和非活动代码在exe中相邻,它们将一起缓存,从而使缓存实际上更小、效率更低
VC2005和更高版本有一个名为PGO的优化,它在可执行文件中对代码进行排序,以确保有效缓存经常使用的代码。我不知道g++是否有类似的优化,但值得研究。这里有一些问题的汇编,wiki会根据需要对其进行编辑: 主要问题似乎是:名称空间污染 这可能会在将来的调试、版本控制中产生问题,并增加将来的维护成本 由于函数/类/名称空间引用将被维护(在符号表中?),因此至少会有较小的二进制膨胀。动态库不应该大大增加二进制文件的大小(但是它们会成为二进制文件运行的依赖项?)。从GNUC编译器判断,如果静态链接库在源代码中从未被引用,则不应包含在最终二进制文件中。(基于C编译器的假设,可能需要澄清/更正) 此外,根据库的性质,可能会实例化全局和静态对象/变量,从而导致启动时间和内存开销增加
哦,增加了编译/链接时间 当我在源代码树中编辑一个文件时,我感到很沮丧,因为我正在处理的一些符号出现在源文件中(例如,函数名,我刚刚更改了原型,或者,遗憾的是,更典型的是,只是将原型添加到了头中),所以我需要检查使用是否正确,或者编译器现在告诉我该文件中的用法不正确。所以,我编辑了这个文件。然后我看到一个问题-这个文件在做什么?事实证明,虽然代码在产品中被“使用”,但实际上根本没有被积极使用 我在星期一发现了这个问题。一个包含10000多行代码的文件调用了函数“extern void add_rements(void);”参数为0。所以,我去修理它。然后我看了看代码的其余部分……结果发现它是一个15年前的开发存根,从未被删除过。干净地删除代码会涉及到对超过六个文件的小编辑——我还没有弄清楚在这种情况下从枚举中间删除枚举常量是否安全。暂时标记为“未使用/过时-是否可以安全删除?” 在过去的15年中,这段代码的覆盖率为零——生产、测试。。。诚然,这只是一个庞大系统的一小部分——就百分比而言,它在图表上的比例不到1%。不过,这是额外的浪费代码 令人费解。烦人的令人沮丧的普遍(到目前为止,我已经记录并修复了今年至少六个类似的bug)
浪费我和其他开发人员的时间。多年来,其他人一直在做我正在做的事情,对该文件进行定期编辑,这是一项彻底的工作。如果构建树没有得到很好的维护,它甚至可能无法编译。如果您在没有交换空间的嵌入式系统上编译。编译器在试图编译大量对象文件时可能会耗尽内存
它最近发生在我们身上。它真的增加了二进制大小吗?对于一个动态链接的库,我不认为它会。它确实不会,名称