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

标签 c++ compiler-construction

我在一本书中读到这一行:

It is provably impossible to build a compiler that can actually determine whether or not a C++ function will change the value of a particular variable.

该段讨论了为什么编译器在检查 const-ness 时是保守的。

为什么无法构建这样的编译器?

编译器总是可以检查一个变量是否被重新赋值,一个非常量函数被调用,或者它是否作为一个非常量参数被传入......

最佳答案

Why is it impossible to build such a compiler?

出于同样的原因,您不能编写一个程序来确定任何给定程序是否会终止。这被称为 halting problem ,这是不可计算的事物之一。

明确地说,您可以编写一个编译器来确定某个函数确实会更改变量在某些情况下,但您不能编写一个可靠地告诉您该函数将会或获胜的编译器'不要为每个可能的函数更改变量(或停止)。

这是一个简单的例子:

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

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

关于c++ - 为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量的值的编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410081/

相关文章:

c++ - 通过返回指向 map 的指针访问 map C++

c++ - .crt 部分?这个警告是什么意思?

c++ - 使用 OpenGL 在 OpenCV 中绘图

Java 断言讨厌的副作用 - 编译器错误?

c++ - 模板化类的模板化成员的函数句柄

c++ - 首先定义 Here c++ error by adding one file

c++ - 导致编译器发出虚假警告的场景有哪些?

java - Eclipse 转换为 .jar 不起作用

c# - C# 的 CodeDom 编译器

c# - 警告 : Field is never assigned to, 并将始终具有默认值 null