【发布时间】:2018-05-16 22:09:59
【问题描述】:
在 C/C++ 中,仅当结果指针位于原始指向的 complete object 内时,才定义 addition or subtraction on pointer。而且,两个指针的comparison只有在两个指向的对象是唯一的完整对象的子对象时才能执行。
这些限制的原因是什么?
我认为分段内存模型(参见here §1.2.1)可能是原因之一,但由于编译器实际上可以定义所有指针的总顺序,正如answer 所展示的那样,我对此表示怀疑。
【问题讨论】:
-
@oliv 一个原因可能是更多的 UB 可以实现更多的优化;考虑 "int x[10];int* py = x + j;",这里编译器可以合法地对 j 的范围做出假设
-
@MassimilianoJanes 鉴于 C 的历史和使用 UB 进行优化,我认为优化潜力不太可能是 C 中任何 UB 的原因。
-
在分段架构中,如果地址架构允许段地址方案重叠,
pa - pb将有多个正确答案。 -
@oliv 如果您(或任何人)能够产生一个 genuine 用例,这种放宽的要求将变得有用,那将会有所帮助;恕我直言,为了公平起见,这样的用例应该 1)适用于最新标准,2)应该不有一个等效的、可移植的解决方案,3)应该不依赖于任何进一步的未定义行为。只有这样,才能将此类用例与此类决策所导致的一般性损失进行有意义的比较。
-
@PasserBy 关于 std::less 和内置运算符,它们有很好的理由表现不同。为了效率,应该允许内置比较运算符使用架构自然比较指令,并且由于分段寻址或多个地址空间的原因,可能无法以这种方式实现指针的总顺序。对于 std::less,总顺序比效率更重要,可以做额外的工作来处理内存段和地址空间。
标签: c++ c pointers language-lawyer pointer-arithmetic