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

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

本文关键字:如果 标准 更好 预定义 C++ 为什么 未定义      更新时间:2023-10-16

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

1)它允许更好的性能。它简化了编译器的工作,使得在某些情况下生成非常有效的代码成为可能。

2)它允许编译器供应商灵活地在自己的环境中实现它 道路。

如果您知道性能以外的任何其他因素,请告诉我。您的帮助将不胜感激。

谢谢

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

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

C++的设计

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

如果您查看一些未定义行为的情况 - 空指针引用、浮点溢出等。计算机和操作系统的实际行为或多或少是未定义的。您无法假设在发生内存错误时,硬件是否会捕获或特定于操作系统的运行时是否能够以有效方式运行。

我们碰巧主要使用基于 x86 的机器,具有保护模式操作系统,这些操作系统都以合理的程度遵循 POSIX。但这并不总是正确的。

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

存在未定义

行为的大多数情况是因为它未定义,如 1/0

相关文章: