Phi*_*ler 6 c pointers undefined-behavior language-lawyer
因此,标准(参考N1570)说明了以下关于比较指针的内容:
C99 6.5.8/5关系运算符
比较两个指针时,结果取决于指向的对象的地址空间中的相对位置.... [在聚合中剪切明显的比较定义] ... 在所有其他情况下,行为未定义.
这个UB实例的基本原理是什么,而不是指定(例如)转换intptr_t和比较它?
是否存在一些机器架构,其中指针的合理总排序难以构建?是否存在一些优化或分析,不受限制的指针比较会阻碍?
这个问题的删除答案提到这条UB允许跳过段寄存器的比较并且仅比较偏移.保存特别有价值吗?
(同样删除的答案,以及此处的答案,请注意,在C++中,std::less需要对指针实现总顺序,无论正常比较运算符是否执行.)
ub邮件列表讨论中的各种评论<不是指针的总命令的理由?强烈暗示分段架构是其中的原因.包括以下评论,1:
另外,我认为核心语言应该简单地认识到这些天所有机器都具有扁平内存模型的事实.
和2:
然后我们可能需要一种新类型,当从指针转换时保证总顺序(例如,在分段体系结构中,转换需要获取段寄存器的地址并添加存储在指针中的偏移量).
和3:
指针虽然历史上并非完全有序,但对于现有的所有系统来说实际上都是如此,除了委员会的象牙塔之外,所以这一点没有实际意义.
和4:
但是,即使分段的体系结构(尽管它不太可能)确实回来了,仍然必须解决排序问题,因为需要std :: less才能完全排序指针.我只想让operator <成为该属性的替代拼写.
为什么其他人都假装受苦(而且我的意思是假装,因为除了委员会的一小部分人之外,人们已经假设指针完全与运营商<有关),以满足一些目前不存在的架构的理论需求?
与ub邮件列表的评论趋势相反,FUZxxl指出支持DOS是不支持完全有序指针的原因.
更新
这也通过支持的带注释的C++参考手册(ARM),其表示,这是由于支撑这对分段架构负担:
在分段体系结构上,表达式可能不会被评估为false [...]这就解释了为什么指针的加法,减法和比较仅针对指向数组的指针和超出结尾的一个元素进行定义.[...]具有非分段地址空间的机器的用户开发了习惯用法,但是,除了特殊的努力之外,提到超出阵列末尾的元素不能移植到分段架构[...]允许[...]费用昂贵,几乎没有用处.