未定义行为的意义何在?

时间:2017-02-24 11:41:00

标签: c++ c language-lawyer undefined-behavior

我可以理解留下一些实现定义,以便实现它的特定人员知道什么是最好的发生,但为什么会有一些未定义的行为?为什么不说,其他任何东西都是实现定义的?

2 个答案:

答案 0 :(得分:6)

在很多情况下,确保实现定义的行为不可避免地会产生开销。

例如,如何使缓冲区溢出实现定义的行为?可能在检测到异常时抛出异常,或者可能终止程序?但这样做总是需要边界检查。

C ++的设计使得性能几乎不会受到影响。

有Go,Rust和Java等语言进行边界检查。而且他们都需要为安全付出代价。

答案 1 :(得分:4)

语言规范可以看作是编译器编写者和程序员之间的契约。有些事情是程序员认为编译器会做(而不是做)。编译器编写者假设程序员会做的事情很少。

编译器编写者假定程序员会编写已记录行为或没有未定义行为的代码。基于该编译器,编写者可以忽略一些构造,并且与未修改这些构造的情况相比,可以使编译的程序更快。规范中记录了一些这样的(尽可能多的)未定义的构造,以便程序员了解这种构造。

存在这种未定义的行为,以减少规范实施中不必要的复杂性,有时还留有空间用于优化。