未定义行为的消除并不是没有代价的,是否支付这种代价是设计语言的重要选择,无论选哪个都有站得住脚的理由。这里说的代价还不仅是性能上的,还可能就是语言能力上的。
比如硬件编程就是可能需要读写固定物理地址,这在c语言标准中也是未定义行为(c语言规定合法指针算数只能指向数组内),可在特定硬件场景下也不能不用。语言特性不符合自己应用场景也不奇怪,因为种种其他原因换不了语言也只能凑合用。
下标边界检查本身是个相对容易说清楚的事,静态检查原理上就做不到准确,动态检查会慢(极端情况可能慢千百倍)。数值计算领域要求不能加动态检查,至少内循环不能加,否则慢得不能接受;应用开发领域要求最好都加动态检查,这是个利弊权衡的事。
语言是不是要求静态/动态检查下标?某款编译器是不是静态/动态检查?检查结果是是否有强制效果?这几个事儿其实还是有挺多差别的。
【 在 mrunmatched 的大作中提到: 】
: 嗯,程序出现未定义行为太吓人了,这种bug神出鬼没,特别难追踪
: 【 在 HerSMTH 的大作中提到: 】
: :
: ...................
--
修改:milksea FROM 114.249.213.*
FROM 114.249.213.*