有时在编程时,我们定义或声明函数、定义、变量、宏包含和数据结构。但在那之后永远不要使用那些。
- 那些未使用的资源会被编译器自动删除(现代编译器能够优化)?
- 反正有识别那些吗?
有时在编程时,我们定义或声明函数、定义、变量、宏包含和数据结构。但在那之后永远不要使用那些。
这取决于:
宏由编译器转换为程序文本。除了替换它们的文本之外,它们不代表任何东西,并且不会超出编译时间(除非......见下文)。
如果局部变量没有重要的构造函数或析构函数,它们可能会被删除。
(您不希望scoped_lock
仅仅因为稍后在代码中没有引用它而将其删除。)对于具有内部链接的变量和函数(例如,使用关键字在命名空间范围内定义static
)也是如此。然而,在大多数情况下,此类对象所需的资源很少,而且节省的费用可以忽略不计。
功能有点不同,并且取决于。一个虚函数通常会被认为是“使用过的”,如果曾经有一个它的类型的实例,它几乎肯定会存在,即使它从未被调用过。
除此之外(这也适用于全局变量):这取决于链接器。大多数链接器的粒度是编译“翻译单元”产生的目标文件:该目标文件要么是程序的一部分,要么不是程序的一部分。如果您告诉链接器合并目标文件,那么您应该得到其中的所有内容。如果您将目标文件放在(静态)库中,并告诉链接器使用它,那么当且仅当它解析了其他未解析的外部时,链接器才会将目标文件合并到您的程序中。但如果它合并了目标文件,它通常会合并所有的。(任何好的库都会把每个非虚拟函数放在一个单独的目标文件中,所以你不会得到比你需要的更多的东西。)
在这方面,DLL 的行为类似于目标文件(尽管它们的名称)。如果您将目标文件链接到 DLL,则使用它的程序将获得所有 DLL,或者没有。
最后:虽然不是程序的一部分,但目标文件和最终的可执行文件通常会包含符号信息;最好的系统甚至会维护有关宏的信息,以便调试器可以按照您编写的方式显示内容。(它可以用宏做多远是有争议的。)
如果编译器或链接器可以看到没有对 C 函数或 C 变量的引用,他们可以(并且通常会)删除那些未使用的东西。
未使用的宏定义根本不会进入编译代码。typedef 等也是如此。
然而,删除在程序的汇编部分中实现的未使用的代码和数据是比较困难的。
对于编译器来说,是否会使用或执行某个引用变量或某些代码并不总是显而易见的。
所以,是的,这些天来,大部分明显未使用的东西都被删除了。