c++ - 限制指针算术或比较的基本原理是什么?

标签 c++ c pointers language-lawyer pointer-arithmetic

在 C/C++ 中,addition or subtraction on pointer仅当结果指针位于原始指向的 complete object 内时才定义.此外,comparison只有当两个指向的对象是唯一的完整对象的子对象时,才能执行两个指针的组合。

这些限制的原因是什么?

我认为分段内存模型(参见 here §1.2.1)可能是原因之一,但因为编译器实际上可以定义所有指针的总顺序,如 answer 所示,我对此表示怀疑。

最佳答案

原因是为了保持生成合理代码的可能性。这适用于具有平坦内存模型的系统以及具有更复杂内存模型的系统。如果您禁止(不是很有用)极端情况,例如在数组中添加或减去,并要求对象之间指针的总顺序,您可以在生成的代码中跳过很多开销。

标准施加的限制允许编译器对指针算法做出假设并使用它来提高代码质量。它涵盖了在编译器中而不是在运行时静态计算事物以及选择要使用的指令和寻址模式。例如,考虑一个具有两个指针 p1p2 的程序。如果编译器可以推导出它们指向不同的数据对象,它可以安全地假设任何基于以下 p1 的无操作将永远影响 p2 指向的对象。这允许编译器根据 p1 重新排序加载和存储,而不考虑基于 p2 的加载和存储,反之亦然。

关于c++ - 限制指针算术或比较的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47616508/

相关文章:

c++ - 队列数组指针 (C++)

c++ - 如何将鼠标点击和拖动发送到后台的另一个程序?

c++ - 删除作为公共(public)类成员的指针

c - 目标文件如何在 C 中链接?解释这种特殊情况

在C中将uint16_t十六进制数转换为十进制数

c - 如何在目录中找到最新的文件?

结构中动态数组中结构中动态分配数组的 C 语法

c++ - 使用 Python 或其他嵌入式脚本语言部署应用程序

c++ - 具有类型转换的模板特化

c++ - 如果由同一应用程序触发,则丢弃 QClipboard::dataChanged() 信号