C++编译器可以自动消除重复的代码吗?

sha*_*oth 6 c++ compiler-construction

代码重复通常糟糕,通常很容易发现.我想编译器可以在最简单的情况下自动检测它 - 它们已经解析了文本并获得了他们以各种方式分析的中间表示 - 检测可疑模式,如未初始化的变量,优化发出的代码等等.我猜他们经常可以检测到功能重复以这种方式编码并在发出机器代码时对其进行说明.

是否有C++编译器可以检测重复的代码并且只发出一次相应的机器代码而不是源文本中的每个副本?

Mat*_* M. 9

有些人有,有些则没有.

从LLVM优化的页面:-mergefunc(MergeFunctions传递,它是如何工作的)

这些函数在LLVM中间表示中以小块分隔,此优化过程尝试合并类似的块.但是不能保证成功.

您会在此页面上找到许多其他优化,即使其中一些可能在第一眼看上去很神秘.

我会添加一个注释,重复的代码对于编译器/可执行文件来说并不是那么糟糕,从维护的角度来看它是坏的,并且编译器无法做到这一点.


jk.*_*jk. 8

我认为这个问题假设编译器总是希望消除代码重复.代码重复不利于源代码的可读性/可维护性而不是编译代码的必要性能,实际上可以考虑将循环展开视为编译器添加重复代码以提高速度.编译后的代码不需要遵循与源代码相同的原则,并且通常不会像机器那样不能用于人类阅读.

通常编译器正在忙于编译而不是转换源代码,当然IDE可能允许这两者.

  • 与大多数事情一样,有一个权衡,但我认为编译器应该总是试图消除重复是假的 (3认同)
  • 合并代码减少了生成的库/可执行文件的大小,因此它也可以加快执行速度.我同意它会与循环展开有些冲突. (2认同)
  • 我根本没有看到这个问题在哪里做出这样的假设.它询问是否有任何编译器这样做,而不是它是否是一个好主意,也不是***可以*执行它的编译器是否*会这样做. (2认同)