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 标准是否允许自修改代码? 的相关文章

  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • Code First - 实体框架 - 如何公开外键

    我有以下数据对象 public class Customer System Data Entity ModelConfiguration EntityTypeConfiguration
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • 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