nor*_*ner 4 c c++ undefined-behavior language-lawyer
我可以理解留下一些实现定义,以便实现它的特定人员知道什么是最好的发生,但为什么会有一些未定义的行为?为什么不说,其他任何东西都是实现定义的?
在很多情况下,确保实现定义的行为不可避免地会产生开销.
例如,如何使缓冲区溢出实现定义的行为?可能在检测到异常时抛出异常,或者可能终止程序?但这样做总是需要边界检查.
C++的设计使得性能几乎不会受到影响.
有Go,Rust和Java等语言进行边界检查.而且他们都需要支付安全费用.
语言规范可以被视为编译器编写者和程序员之间的契约。有些事情程序员假设编译器会做(和不会做)。编译器编写者很少假设程序员会做的事情。
编译器编写者假设程序员将编写已记录行为或没有未定义行为的代码。基于此,编译器编写者可以忽略某些构造,并且与那些构造未定义的情况相比,可以使编译的程序更快。其中一些(尽可能多的)未定义的构造记录在规范中,以使程序员了解此类构造。
这种未定义的行为的存在是为了减少规范实现中不必要的复杂性,有时还为优化留出空间。
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |