为什么有些东西在 C++ 中留下未定义的行为?如果其中一些在标准中预先定义不是更好吗?

Why some things left undefined behavior in C++? Wouldn't it be better if some of them pre-defined in the standard?

我是C++程序员。在网上冲浪期间,我熟悉了未定义行为、未指定行为、实现定义行为等术语。我想知道为什么有些事情没有定义?我知道 C++ 与硬件很接近,但是真的很难为它们中的某些定义行为吗?如果是这样,他们为什么不这样做?这个问题是关于遗漏如此多的行为以供编译器实现的哲学。我认为并相信这样做有以下两个优点:

1) It allows better performance. It simplifies the job of compiler, making it possible to generate very efficient code in certain situations.

2) It allows flexibility to compiler vendors to implement it in their own way.

如果您知道性能以外的任何其他因素,请告诉我。 非常感谢您的帮助。

谢谢

除了您已经提到的原因之外,重要的一件事是了解 CPU 的不同之处。他们仍然这样做,但过去更糟。试图准确指定 C++ 在极端情况下的行为是没有帮助的。例如。 0/0 将被不同的 CPU 处理不同,这对真正的程序来说并不重要。

另一个问题是一些 UB 很难被发现。例如,跨翻译单元违反单一定义规则需要链接器阶段的支持,并且对于依赖原始链接器的供应商有相当大的容忍度。

C++ 的设计理念不会强迫您做出选择。如果某些东西受到体系结构的限制,那么就会有限制,但除此之外,很少有关于可以有多种解释的语义的任意决定。

如果您查看一些未定义行为的情况 - 空指针引用、浮点溢出等。计算机和 OS 的实际行为或多或少是未定义的。您不能假设硬件是否会陷入困境,或者 OS 特定 运行 时间是否能够在发生内存错误时以有效方式运行。

我们碰巧主要使用基于 x86 的机器,保护模式 OSes 都在合理程度上遵循 POSIX。但这并不总是正确的。

存在一些体系结构,其中仅初始化指向无效地址的指针会导致硬件陷阱 - 您甚至不必取消引用它。

存在未定义行为的大多数情况是因为它是 未定义 就像 1/0