由于未定义行为的存在,许多糟糕的事情已经发生并且仍在发生(或者没有发生,谁知道呢,一切皆有可能)。我理解这是为了给编译器留下一些灵活性以进行优化,也可能是为了使C ++更容易移植到不同的平台和架构。然而,由未定义行为引起的问题似乎过于严重,无法通过这些论点来证明其合理性。还有其他关于未定义行为的论点吗?如果没有,为什么未定义行为仍然存在?
编辑:为我的问题添加一些动机:由于与不那么精通C ++的同事发生了几次不愉快的经历,我已经开始习惯尽可能地使我的代码更加安全。对每个参数进行断言、坚定的const正确性等等。我试图留下尽可能少的空间来使用我的代码方式错误,因为经验表明,如果有漏洞,人们将利用它们,然后他们会指责我的代码质量差。我认为使我的代码尽可能安全是一个好的实践。这就是为什么我不理解为什么会出现未定义行为。请问能否举个例子,说明不能在运行时或编译时检测到的未定义行为,而不带来相当大的开销?
int
溢出被视为未定义行为的最重要的好处之一是,使用int
循环计数器索引数组仍然可以将其优化为指针增量或其他操作,而无需额外检查循环是否一定会在不包装的情况下终止。请参见 Is there some meaningful statistical data to justify keeping signed integer arithmetic overflow undefined? 和 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html。 - Peter Cordes