在 C/C++ 中,addition or subtraction on pointer仅当结果指针位于原始指向的 complete object 内时才定义.此外,comparison只有当两个指向的对象是唯一的完整对象的子对象时,才能执行两个指针的组合。
这些限制的原因是什么?
我认为分段内存模型(参见 here §1.2.1)可能是原因之一,但因为编译器实际上可以定义所有指针的总顺序,如 answer 所示,我对此表示怀疑。
最佳答案
原因是为了保持生成合理代码的可能性。这适用于具有平坦内存模型的系统以及具有更复杂内存模型的系统。如果您禁止(不是很有用)极端情况,例如在数组中添加或减去,并要求对象之间指针的总顺序,您可以在生成的代码中跳过很多开销。
标准施加的限制允许编译器对指针算法做出假设并使用它来提高代码质量。它涵盖了在编译器中而不是在运行时静态计算事物以及选择要使用的指令和寻址模式。例如,考虑一个具有两个指针 p1
和 p2
的程序。如果编译器可以推导出它们指向不同的数据对象,它可以安全地假设任何基于以下 p1
的无操作将永远影响 p2
指向的对象。这允许编译器根据 p1
重新排序加载和存储,而不考虑基于 p2
的加载和存储,反之亦然。
关于c++ - 限制指针算术或比较的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47616508/