为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器?

2023-12-25

我在一本书上读到这样一句话:

事实证明,构建一个可以实际执行的编译器是不可能的 确定 C++ 函数是否会更改 a 的值 特定变量。

该段落讨论了为什么编译器在检查常量性时是保守的。

为什么不可能构建这样的编译器?

编译器始终可以检查变量是否被重新分配,是否正在对其调用非常量函数,或者是否作为非常量参数传入......


为什么不可能构建这样的编译器?

出于同样的原因,您无法编写一个程序来确定任何给定程序是否将终止。这被称为停止问题 http://en.wikipedia.org/wiki/Halting_problem,这是不可计算的事情之一。

需要明确的是,您可以编写一个编译器来确定函数确实更改了变量在某些情况下,但是您无法编写一个可靠地告诉您该函数将或不会更改每个可能函数的变量(或停止)的代码。

这是一个简单的例子:

void foo() {
    if (bar() == 0) this->a = 1;
}

编译器如何仅通过查看该代码来确定是否foo将会永远改变a?是否执行取决于函数外部的条件,即执行bar。证明停止问题不可计算的证据还不止这些,但在链接的维基百科文章(以及每本计算理论教科书)中已经很好地解释了它,所以我不会尝试在这里正确解释它。

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

为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器? 的相关文章

随机推荐

  • Android 共享首选项不起作用

    我有一项服务 其中有4个全局静态int变量我有一个启动完成和呼叫事件的接收器 我想做的是每当执行 Call 事件接收器时保存这 4 个变量 并在执行 BOOT 接收器时检索它们 当然当我重新启动手机时 但两者都不起作用 另一件事设备重新启动
  • Powershell使用ODBC DSN而不是连接字符串从数据库读取

    我知道如何使用连接字符串从数据库读取值 即 建立数据库连接进行读取 conn New Object System Data SqlClient SqlConnection conn ConnectionString Server 10 10
  • GitHub Pages:如何将文本环绕在图像周围?

    我有一个 GitHub 博客页面 在博客页面中间的某个位置 我有一张图像 其中显示了以下 Markdown 内容 My Image pathto myimage png 这可以很好地显示图像 但我还想添加一个段落 包裹在图像的右侧 来描述图
  • bigquery 使用嵌套字段进行旋转

    我有一个带有架构的 bigquery 表 我想要这样的结果 flow timestamp channel name number of digits 2019 10 31 15 31 15 channel name 1 3 2019 10
  • Azure AD 在有效访问令牌上返回 Authentication_ExpiredToken

    我越来越Your access token has expired Please renew it before submitting the request 当我打电话时https graph windows net myorganiza
  • frisby 的 Get 方法不适用于 https

    我是弗里斯比测试的新手 今天发现无法访问https ip https ip来自 friby api 的地址 例如 frisby create my test get https 199 59 148 20 output connect er
  • Eclipse/MySQL 集成插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我的顺风滚动 snap x 无法工作,您能找到解决方案吗?

    所以我使用 Tailwind CSS 但遇到了问题 所以我正在学习如何在顺风 CSS 上进行滚动捕捉 滚动对齐 y 有效 但滚动对齐 x 不起作用 我尝试了一切让我的代码滚动 snap x 但它不起作用 你们中的任何人都可以修复我的顺风代码
  • 霍夫变换 C# 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 让我们看一下这个 C 实现 https github com andrewkirillov AForge NET blob a9453
  • iOS 中自定义 UIStatusBar

    有没有办法自定义UIStatusBar class 有关可以使用状态栏 或围绕状态栏 执行的操作的示例 请查看此 Github 项目 https github com myell0w MTStatusBarOverlay https git
  • 枚举构造函数(创建成员的成员)

    在 D 中 我试图创建一个成员有成员的枚举 我可以通过一个例子更好地解释我想要做什么 其中s and i代表我试图创建的子成员 在Python中 我可以这样做 class Foo enum Enum A A string 0 B B str
  • 在 VSCode 中禁用 Javascript 的特定错误消息?

    我在 JavaScript 中使用类属性 静态和普通 和装饰器 有没有办法启用其他 ES 阶段的代码突出显示或禁用它们的特定错误消息 VSCode 告诉我只能在 TypeScript 中使用类属性 因此它似乎可以识别它们 您可以使用以下命令
  • 如何给java足够的时间给变量赋值? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个循环 在循环的末尾有一个String 被添加到ArrayList 在类中声明而不是方法 并在循环开始时说Stri
  • 如何发出数据流已完成的信号?

    我有一个类 它使用 TPL 数据流实现由 3 个步骤组成的数据流 在构造函数中 我将步骤创建为 TransformBlocks 并使用 LinkTo 将它们链接起来 并将 DataflowLinkOptions PropagateCompl
  • 在 PHP 7.4 中使用 FFI 加载库时出现问题

    我在新的 FFI 中使用 PHP 中的第三方 so 库时遇到问题 当我运行这段小代码时
  • 如何获取asp.net下拉列表的选定值并将其存储在会话变量中?

    Dim ename As String DropDownList SelectedItem Value 这个声明不起作用 任何帮助表示赞赏 我不确定这是否是您的问题 但如果您正在寻找所需的项目文本 而不是值 DropDownList Sel
  • 使用 Jquery 从第一个下拉列表中过滤第二个下拉列表

    Team 我有两个下拉菜单说 年 和 节 1 年份下拉菜单将有以下选项 显示全部 1 2 3 4 2 部分下拉菜单将有以下选项 所有部分 1 部分 A 1 部分 B 1 部分 C 2 部分 A 2 部分 B 3 部分 A 4 部分 A 4
  • 强制用户在 iOS 中以编程方式更新应用程序

    在我的 iOS 应用程序中 我启用了强制应用程序更新功能 是这样的 如果有严重的错误修复 在服务器中我们正在设置新的发行版本 在启动屏幕中 我正在检查当前的应用程序版本 如果它低于服务版本 则会显示一条更新应用程序的消息 我放置了 2 个按
  • Spring RestTemplate - 需要释放连接吗?

    这是我的 Rest 模板配置 Bean Qualifier myRestService public RestTemplate createRestTemplate Value connection timeout String maxCo
  • 为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器?

    我在一本书上读到这样一句话 事实证明 构建一个可以实际执行的编译器是不可能的 确定 C 函数是否会更改 a 的值 特定变量 该段落讨论了为什么编译器在检查常量性时是保守的 为什么不可能构建这样的编译器 编译器始终可以检查变量是否被重新分配