由于未定义的行为,发生了许多不好的事情,并且继续发生(或者不发生,谁知道什么都可能发生)。我知道,引入它是为了给编译器留出一些摆动的空间来进行优化,也可能使C++更容易移植到不同的平台和体系结构。但是,由不确定行为引起的问题似乎太大,无法用这些论据来证明。未定义行为的其他参数是什么?如果不存在,为什么未定义的行为仍然存在?
编辑为我的问题添加一些动力:由于缺乏C++熟练 worker 的几次不良经历,我已经习惯于使我的代码尽可能安全。声明每个参数,严格的const-正确性以及类似的内容。我尝试留下尽可能少的空间来以错误的方式使用我的代码,因为经验表明,如果存在漏洞,人们会使用它们,然后他们会告诉我我的代码不好。我认为使代码尽可能安全是一种好习惯。这就是为什么我不明白为什么存在未定义行为的原因。有人可以给我举一个未定义行为的例子吗,如果没有大量开销就无法在运行时或编译时检测到该行为?
最佳答案
我认为关注的重点首先来自于速度的C/C++哲学。
这些语言是在原始能力稀疏的时候创建的,您需要获得所有可能的优化,以使某些功能可用。
指定如何处理UB意味着首先要检测到它,然后当然要指定适当的处理方式。但是,检测它与语言的速度优先原则背道而驰!
今天,我们仍然需要快速的程序吗?是的,对于那些使用非常有限的资源(嵌入式系统)或使用非常苛刻的约束(响应时间或每秒事务)的人,我们确实需要尽可能地挤出资源。
我知道座右铭是在解决这个问题。我们有一个我工作的应用程序:
它可以在大约40个怪物上运行:8个双核心opteron(2800MHz)和32GB RAM。此时,要使用更多的硬件来“更快地”变得困难,因此我们需要优化的代码和允许它的语言(我们确实限制了将汇编代码放在那里)。
我必须说,无论如何,我对UB不太在意。如果您知道程序将调用UB,则它需要修复实际发生的任何行为。当然,如果立即报告它们,将更容易修复它们:这就是调试版本的目的。
因此,也许与其专注于UB,不如我们应该学习使用这种语言:
一切突然变得更好了:)
关于c++ - 未定义的行为值得吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2771825/