我正在阅读有关JIT优于预编译的优点,其中之一是JIT可以根据实际运行时数据调整分支预测.自从我在大学写一个编译器以来已经很长时间了,但在我看来,在大多数情况下(没有明确的getos),预编译代码也可以实现类似的东西.
请考虑以下代码:
test x
jne L2:
L1: ...
jmp L3:
L2: ...
L3:
Run Code Online (Sandbox Code Playgroud)
如果我们有一些运行时检测可以看到'jne L2'为真的次数,它可以物理地交换L1:block和L2:block中的所有指令.当然,它必须知道交换期间任何一个块都没有线程,但这些都是细节......
test x
jeq L1:
L2: ...
jmp L3:
L1: ...
L3:
Run Code Online (Sandbox Code Playgroud)
我知道程序代码加载到只读内存等时也存在问题,但这是一个想法.
所以我的问题是,这样的JIT优化是否适用于C/C++,还是我错过了一些无法做到这一点的根本原因?那里有C/C++的JIT优化器吗?