首页 > 解决方案 > 编译器可以生成自修改代码吗?

问题描述

通常说一个static变量初始化被包裹在一个an中if,以防止它被多次初始化。

对于这个和其他一次性条件,让代码在第一次通过自我修改后删除条件会更有效。

是否允许 C++ 编译器生成此类代码,如果不允许,为什么?听说可能对缓存有负面影响,但不知道具体情况。

标签: c++assemblycompiler-optimizationself-modifying

解决方案


没有什么可以阻止编译器实现您的建议,但它是一个非常小的性能问题的相当重量级的解决方案。

为了实现自修改代码,对于在 Windows 或 Linux 上运行的典型 C++ 实现,编译器必须插入会更改代码页上的权限的代码,修改代码,然后恢复权限。这些操作很容易花费比隐含的“if”操作占用程序生命周期更多的周期。

这也会导致阻止修改后的代码页在进程之间共享。这似乎无关紧要,但编译器通常会悲观他们的代码(在 i386 的情况下非常糟糕),以便实现可以在运行时加载不同地址的位置无关代码,而无需修改代码并防止共享代码页。

正如 Remy Lebeau 和 Nathan Oliver 在评论中提到的那样,还需要考虑线程安全问题,但它们可能可以被处理,因为有各种热补丁可执行文件的解决方案。


推荐阅读