代码之家  ›  专栏  ›  技术社区  ›  Gordon Gustafson

指针和引用之间的低级区别是什么?

  •  11
  • Gordon Gustafson  · 技术社区  · 15 年前

    如果我们有此代码:

    int foo=100;
    int& reference = foo;
    int* pointer = &reference;
    

    在引用数据和指针数据中没有实际的二进制差异。(它们都包含内存中的位置 foo )

    第2部分

    那么指针和引用之间的其他区别在哪里呢?( discussed here) 进来吗?编译器是否强制它们,或者它们实际上是可装配级别上不同类型的变量?换句话说,下面的代码是否产生相同的汇编语言?

    foo=100;
    int& reference=foo;
    reference=5;
    
    foo=100;
    int* pointer=&foo;
    *pointer=5;
    
    4 回复  |  直到 15 年前
        1
  •  18
  •   Crashworks    15 年前

    理论上,它们可以以不同的方式实现。

    在实践中,我见过的每个编译器都编译指向同一机器代码的指针和引用。区别完全在语言层面上。

    但是,就像凯迪金斯说的,你不应该 依赖 在验证编译器和平台的正确性之前。

        2
  •  10
  •   Community George Stocker    7 年前

    C++代码与编译器生成的机器代码之间的关系绝对没有什么可信赖的。

    有人说“以我的经验…但这比你可能意识到的更不可靠。很少有人在所有可能的编译器/体系结构组合的任何实质性方面有实际经验。[编辑:我认为 Crashworks 但证明我错了。-())

    考虑以下内容 list of C++ compilers :

    • C++ Builder
    • Turbo C++资源管理器
    • C++编译程序
    • Borland C++
    • DOS的Turbo C++
    • 铿锵声
    • C/C++
    • Cosy编译器开发系统
    • 数字火星
    • DJGPP
    • 边臂C/C++
    • 工具链
    • GCC C++(G++)
    • 惠普AC++
    • 英特尔C++编译器
    • 微电子技术
    • 多种
    • 开放沃特姆
    • Open64
    • 路径比例
    • PGI工作站
    • Prodev研讨会
    • RealVIEW C/C++编译器(ARMCC)
    • SAS/C C++
    • 阳光工作室
    • 纤丝
    • 矢量
    • Visual C++
    • VisualAc++
    • XL C/C++

    现在用下面的数字乘以这个列表 short list of machine architectures :

    • 手臂
    • 阿特梅尔AVR
    • 黑鳍鱼
    • HC12
    • H8/300
    • IA32(x86)
    • X86—64
    • IA64
    • 摩托罗拉68000
    • MIPS
    • PA-RISC公司
    • PDP-11
    • PowerPC
    • R8C/M16C/M32
    • SPU
    • 系统/390/Z系列
    • 超高频
    • SPARC公司
    • 瓦克斯
    • A29 K
    • 克拉霉素
    • d30伏
    • DSP16xx
    • FR—30
    • FR V
    • 英特尔I960
    • IP2000标准
    • M32
    • 68 HC11
    • MCORE
    • 混音
    • Mn10200
    • Mn10300
    • 摩托罗拉88000
    • NS32 K
    • 蹦蹦跳跳
    • StoMy16
    • V850
    • 西滕萨
    • AVR32

    现在乘以操作系统和优化标志,您可能会发现每个人的经验都非常缺乏。

        3
  •  1
  •   nschmidt    15 年前

    指针和引用在C++中有不同的语义,但是生成的代码是相同的。

        4
  •  0
  •   ceo    15 年前

    只是为了进一步说明,虽然几乎所有编译器的引用都与引擎盖下的指针相同,但依赖于这种行为是一个严重的错误。它不仅可能在你最不期待的时候咬到你的屁股,而且也不正确地使用参考资料。如果你需要一个指针,就用一个指针。