c++ - 编译器是否删除未使用的函数、定义、变量、宏、包含等?

标签 c++ visual-c++ gcc compiler-construction

有时在编程时,我们定义或声明函数、定义、变量、宏包含和数据结构。但在那之后永远不要使用它们。

  1. 那些未使用的资源是否会被编译器自动删除(现代编译器能够优化)?
  2. 有办法识别它们吗?

最佳答案

这取决于:

宏由编译器转换为程序文本。他们 除了替换它们的文本之外,不代表任何其他内容, 并且不要超过编译时间(除非......见下文)。

局部变量等可能会被删除,如果它们没有 一个非平凡的构造函数或析构函数。 (你不想要scoped_lock 这样的东西被移除只是因为你没有 稍后在代码中引用它。)这同样适用于变量 和具有内部链接的函数(例如在命名空间中定义 使用关键字 static 的作用域)。然而,在大多数情况下, 此类对象所需的资源最少,并且节省了 微不足道。

功能有点不同,并且取决于。虚函数 如果有实例,通常将被视为“已使用” 它的类型,它几乎肯定会存在,即使它 永远不会被调用。

除此之外(这也适用于全局变量): 直到链接器。大多数链接器的粒度是对象 编译“翻译单元”产生的文件:那个 目标文件是或不是程序的一部分。如果你 告诉链接器合并目标文件,那么你应该 得到里面的一切。如果你把目标文件放在 一个(静态)库,并告诉链接器使用它,然后 如果并且 仅当它解决了其他 Unresolved external 问题时。但如果它 包含目标文件,它通常会包含所有 它的。 (任何好的库都会把每个非虚函数放在 一个单独的目标文件,所以你不会得到超过你需要的。)

在这方面,DLL 的行为类似于目标文件(尽管它们 姓名)。如果将目标文件链接到 DLL,程序 使用它的将获得所有 DLL,或者没有。

最后:虽然不是你程序的一部分,目标文件和 最终的可执行文件通常包含符号信息; 最好的系统甚至会维护有关的信息 宏,以便调试器可以按照您的方式显示内容 写了他们。 (它能用宏做到多远是值得商榷的。)

关于c++ - 编译器是否删除未使用的函数、定义、变量、宏、包含等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782515/

相关文章:

C++:读取和排序二进制文件

c++ - 应用程序配置不正确错误 C++

c++ - 虚函数实现缺少类型说明符

linux - `file`,为什么可执行文件没有报告为可执行文件?

c - GCC编译器: error linker command failed using the Make file

c++ - 使用通配符搜索 QTableWidget 时出现问题

c++ - 为什么这里会出现这种歧义?

c++ - 为什么 std::queue 不实现 insert() 而 std::deque 实现?

c++ - 在 64 位操作系统上运行的 32 位应用程序

c++ - 是否可以在 VSVC 和 GCC 中统一 std::wstring 行为?