c++ - 编译器可以生成自修改代码吗?
问题描述
通常说一个static
变量初始化被包裹在一个an中if
,以防止它被多次初始化。
对于这个和其他一次性条件,让代码在第一次通过自我修改后删除条件会更有效。
是否允许 C++ 编译器生成此类代码,如果不允许,为什么?听说可能对缓存有负面影响,但不知道具体情况。
解决方案
没有什么可以阻止编译器实现您的建议,但它是一个非常小的性能问题的相当重量级的解决方案。
为了实现自修改代码,对于在 Windows 或 Linux 上运行的典型 C++ 实现,编译器必须插入会更改代码页上的权限的代码,修改代码,然后恢复权限。这些操作很容易花费比隐含的“if”操作占用程序生命周期更多的周期。
这也会导致阻止修改后的代码页在进程之间共享。这似乎无关紧要,但编译器通常会悲观他们的代码(在 i386 的情况下非常糟糕),以便实现可以在运行时加载不同地址的位置无关代码,而无需修改代码并防止共享代码页。
正如 Remy Lebeau 和 Nathan Oliver 在评论中提到的那样,还需要考虑线程安全问题,但它们可能可以被处理,因为有各种热补丁可执行文件的解决方案。
推荐阅读
- r - 在R中将数据框拆分为一定数量的组
- bash - 在bash中转换日期格式
- html - 如何将背景图像(png 图像格式)添加到具有伪元素 ::before 的 div
- amazon-web-services - AWS 系统管理器 + CodeDeploy + Lightsail
- java - 使用模式匹配 instanceof 和 switch 表达式的 Gradle Java 编译错误
- drupal - 将一个类型的内容引用到另一个常量类型
- unit-testing - EFCore xunit 断言 .Include 是否被调用
- python - “未找到 Python,但可以从 Microsoft 商店安装”
- linux - 如何使用sed将双引号保留在双引号中
- r - 2 个样品,无需替换原始样品