代码重复is usually bad,通常很容易发现。我想编译器可以在最简单的情况下自动检测它 - 它们已经解析了文本并获得了他们以各种方式分析的中间表示 - 检测可疑模式,如未初始化的变量,优化发出的代码等等。我猜他们经常可以检测到功能重复以这种方式编码并在发出机器代码时对其进行说明。
是否有C ++编译器可以检测重复代码并且只发出一次相应的机器代码而不是源文本中的每个副本?
答案 0 :(得分:9)
有些人有,有些则没有。
从LLVM优化页面:-mergefunc(MergeFunctions pass, how it works)
函数在LLVM中间表示中以小块分隔,此优化过程尝试合并类似的块。但不能保证能够成功。
你会在这个页面上找到很多其他优化,即使其中一些可能在初看起来显得神秘。
我会添加一个注释,重复的代码对于编译器/可执行文件来说并不是那么糟糕,从维护的角度来看它是坏的,并且编译器无法做到这一点
答案 1 :(得分:8)
我认为这个问题假设编译器总是希望消除代码重复。代码重复不利于源代码的可读性/可维护性而不是必要编译代码的性能,实际上可以将loop unrolling视为编译器添加重复代码以提高速度。编译后的代码不需要遵循与源代码相同的原则,并且通常不会像机器那样不能用于人类阅读。
通常编译器正在忙于编译而不是转换源代码,当然IDE可能允许这两者。
答案 2 :(得分:3)
据我所知,代码消除通常不会在函数中发生。因此,如果您在两个不同的函数中编写一些重复的代码,那么将消除该代码的机会非常少(几乎没有)。
有一些优化,例如return value optimization
,function inlining
,可以跨功能发生。然而,大多数优化都是在函数本身内完成的。这通常不是在更高的语言级别完成的,我的意思是编译器不会查看C ++代码并开始优化它。编译器主要有高级语言(C ++)和机器语言之间的中间表示。这种中间表示(IR)有点类似于机器语言,但不完全是编译代码的系统的机器语言。请参阅Wiki页面http://en.wikipedia.org/wiki/Compiler_optimization,它列出了一些优化
答案 3 :(得分:1)
如果指定“最小化代码大小”(/ O1),Visual C ++会执行此操作。所提供的功能在/Og的文档中有所描述,不推荐使用更简单的catch-all选项来支持大小或支持速度(/ O2)。