C 标准是否允许自修改代码?

2024-03-21

C 中的自修改代码是否可以以可移植的方式实现?

我问的原因是,在某种程度上,OOP 依赖于自修改代码(因为在运行时执行的代码实际上是作为数据生成的,例如在 v 表中),但是,似乎如果这太过分了,它会阻止编译器中的大多数优化。

例如:

void add(char *restrict p, char *restrict pAddend, int len)
{
    for (int i = 0; i < len; i++)
        p[i] += *pAddend;
}

优化编译器可以提升*pAddend脱离循环,因为它不会干扰p。然而,这不再是自修改代码中的有效优化.

这样看来,C 似乎不允许自修改代码,但同时,这是否意味着你不能在 C 中做一些类似 OOP 的事情? C真的支持自修改代码吗?


由于多种原因,自修改代码在 C 中是不可能的,其中最重要的是:

  1. 编译器生成的代码完全取决于编译器,并且可能看起来与试图编写修改自身的代码的程序员所期望的完全不同。这是一个基本的做 SMC 根本就是个问题,而不仅仅是可移植性问题。
  2. C 中函数指针和数据指针是完全分开的;该语言无法在它们之间来回转换。这个问题不是根本问题,因为某些实现或更高级别的标准 (POSIX) 保证代码和数据指针共享表示。

除此之外,自修改代码实在是一个非常糟糕的主意。 20 年前它可能有一些用途,但现在它只会导致错误、糟糕的性能和可移植性失败。请注意,在某些 ISA 上,指令缓存是否能够看到对缓存代码所做的更改可能是未指定/不可预测的!

最后,虚函数表与自修改代码无关。纯粹是修改函数的问题pointers,它们是数据,而不是代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 标准是否允许自修改代码? 的相关文章

随机推荐

  • Beautiful soup:提取两个标签之间的所有内容

    我正在使用 BeautifulSoup 从 HTML 文件中提取数据 我想获取两个标签之间的所有信息 这意味着如果我有一个像这样的 HTML 部分 h1 h1 Text i here i has no tag div This is in
  • 在 UWP 中更新绑定的 itemsource 后如何更新 GridView?

    当列表集合中的值发生更改时 我需要刷新 GridView 实际上 我已将列表绑定为 GridView 的项目源 我更改了列表值 但无法反映在 GridView 中 如何在 UWP 中实现这一目标 使用 ObserableListCollec
  • 如何与JPA查询进行时间戳比较?

    我们需要确保 JPQL 查询仅返回最近 30 天内的结果 示例如下 Date now new Date Timestamp thirtyDaysAgo new Timestamp now getTime 86400000 30 Query
  • 为什么我的 C# 数组在转换为对象时会丢失类型符号信息?

    在调查一个错误时 我发现这是由于 c 中的这种奇怪现象造成的 sbyte foo new sbyte 10 object bar foo Console WriteLine 0 1 2 3 foo is sbyte foo is byte
  • Reactive Framework (RX) 可以在 Mono 中使用吗?

    一直在寻找 但我唯一发现的是http evain net blog articles 2009 07 30 rebasing system reactive to the net clr http evain net blog articl
  • 如何在 Nextjs 9 中运行 cron/计划任务?

    我正在使用 Nextjs 构建一个应用程序 并为我的 api 端点使用 Pages api 目录 服务器条目 根目录对我来说是隐藏的 当我的应用程序部署时 如何立即使用 node cron 运行计划任务 我有同样的问题 您可以做的是使用no
  • Java Web 服务框架

    这是我第一次使用 Web 服务 我必须用 java 开发 Web 服务 它应该具有良好的 WS 标准 应该松散耦合 可扩展 高度安全 快速响应时间 我知道我必须考虑权衡 我检查了一些框架 如 Axis2 CXF Spring WS 请分享您
  • WPF,访问组合框所选项目

    我有一个组合框 有四个静态可能的选择 如下所示 主窗口 xaml
  • 覆盖索引的正确字段顺序 - MySQL

    MySQL 中是否有为表创建覆盖索引的标准顺序 这意味着如果我的查询包含 where 子句 order by 和 select 语句中的字段 那么我将以什么顺序将字段添加到索引中以正确创建覆盖索引 覆盖索引采用逗号分隔列表中的列列表 从左侧
  • Flutter:在方向更改期间,当小部件树被锁定时调用 setState() 或 markNeedsBuild()

    我想创建一个应用程序 其 UI 可以根据设备方向进行更新 在肖像布局中 我使用抽屉来显示一些元素 Fig https i stack imgur com 1M9hc png 在横向布局中 没有抽屉 但元素显示在屏幕左侧的列中 Fig htt
  • 使用 Laravel 5 上传 pdf 文件

    我正在使用 Laravel 5 2 我想制作一个可以用它上传 pdf 文件的表单 我想将该文件添加到 public 文件夹中的 files 文件夹中 这是我的观点 div class form group div
  • 我可以使用 HTML5 data-* 属性作为布尔属性吗? [复制]

    这个问题在这里已经有答案了 我想使用自定义布尔属性将元素的内容标记为可编辑 我知道data 属性 但不确定它们是否需要值 我不需要data is editable false 因为缺少该属性是等效的 我只关心它是否为 true 如果该属性存
  • Rails 路线:从根路径“/”获取资源

    我有一个查询资源 我想将其路由到我的域的根目录 因此发布到 会转到queries create行动等 我的路线 rb root to gt home index resources queries path gt 耙子路线 root hom
  • git lfs 迁移有什么作用?

    我以为git lfs migrate重写了存储库的历史记录 以便将指定的大文件保存在 LFS 中 这意味着存储库应该变得更小 因为它不直接包含大文件的所有版本 然而 当我跑步时 git lfs migrate import include
  • “使用 Google 登录”按钮的 data-login_uri 属性应使用什么?

    我正在尝试实现 使用 Google 登录 按钮 如此处记录的 https developers google com identity gsi web guides display button https developers googl
  • 表单提交前预览图像

    我的表单中有 ImageField 有没有办法在提交表单之前显示所选文件 也许在 jQuery 中可以实现 我读到我可以通过 request FILES 以某种方式访问 此文件 但我认为在提交表单之前它会是空的 试试这个 function
  • 在 ASP.NET Web API 中序列化继承类型

    我在 Web API 中序列化继承的对象时遇到问题 DataContract public class Item DataMember public int ID get set DataMember public string Name
  • CSS - 大于选择器 - 选择大于 N 的项目

    我有一些 p 我的 HTML 正文中的元素 我只想显示前两段 然后设置display none到之后的所有段落 为什么下面的代码不起作用 p p 1 p p 2 p p 3 p p 4 p 我的代码仍然在 Chrome 网络浏览器中显示所有
  • GUI 应用程序中的 Web 技术

    您在使用 Web 技术 HTML XML CSS JavaScript 实现 GUI 应用程序的部分功能方面有什么经验 优点和缺点 请说一下 没有服务器 关系数据库 AJAX 或用于会话管理的 cookie 也没有现有的 Web 应用程序
  • C 标准是否允许自修改代码?

    C 中的自修改代码是否可以以可移植的方式实现 我问的原因是 在某种程度上 OOP 依赖于自修改代码 因为在运行时执行的代码实际上是作为数据生成的 例如在 v 表中 但是 似乎如果这太过分了 它会阻止编译器中的大多数优化 例如 void ad