Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含和/或链接非';你的二进制文件没有使用它吗?_C++_Linux_Linker_G++_Ld - Fatal编程技术网

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)


浪费我和其他开发人员的时间。多年来,其他人一直在做我正在做的事情,对该文件进行定期编辑,这是一项彻底的工作。

如果构建树没有得到很好的维护,它甚至可能无法编译。如果您在没有交换空间的嵌入式系统上编译。编译器在试图编译大量对象文件时可能会耗尽内存


它最近发生在我们身上。

它真的增加了二进制大小吗?对于一个动态链接的库,我不认为它会。它确实不会,名称