指针和引用之间的低级差异是什么?

Gor*_*son 11 c++ assembly pointers reference

如果我们有这个代码:

int foo=100;
int& reference = foo;
int* pointer = &reference;
Run Code Online (Sandbox Code Playgroud)

参考数据和指针数据之间没有实际的二进制差异.(它们都包含记忆中的位置foo)

第2部分

那么指针和引用之间的所有其他差异(这里讨论)会在哪里出现?编译器是执行它们还是它们在可组合级别上实际上是不同类型的变量?换句话说,下面是否生成相同的汇编语言?

foo=100;
int& reference=foo;
reference=5;

foo=100;
int* pointer=&foo;
*pointer=5;
Run Code Online (Sandbox Code Playgroud)

Cra*_*rks 18

从理论上讲,它们可以以不同的方式实施.

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

但是,就像cdiggins所说,在你验证它对你的编译器和平台是正确的之前,你不应该依赖于这种推广.

  • 然而,在实践中,编译器通常完全忽略引用,特别是当它们是本地人时. (5认同)
  • 有时指针,如果可以的话. (2认同)

cdi*_*ins 10

C++代码与编译器生成的机器代码之间的关系绝对没有可靠性.

有人说"根据我的经验......等等" 但这比你意识到的更不可靠.在所有可能的编译器/体系结构组合的任何实质性横截面中,没有多少人具有实际经验.[编辑:我认为Crashworks证明我错了.:-)]

考虑以下C++编译器列表:

  • C++ Builder
  • Turbo C++ Explorer
  • C++编译器
  • Borland C++
  • 适用于DOS的Turbo C++
  • Comeau C/C++
  • 舒适的编译开发系统
  • 数字火星
  • DJGPP
  • EDGE ARM C/C++
  • MinGW的
  • GCC C++(G ++)
  • HP aC++
  • 英特尔C++编译器
  • Microtec公司
  • 打开Watcom
  • Open64
  • PathScale公司
  • PGI工作站
  • ProDev WorkShop
  • RealView C/C++编译器(armcc)
  • SAS/C C++
  • 太阳工作室
  • TenDRA
  • VectorC
  • Visual C++
  • VisualAge C++
  • XL C/C++

现在将此列表乘以以下简短的机器架构列表:

  • Atmel AVR
  • Blackfin处理器
  • HC12
  • H8/300
  • IA-32(x86)
  • X86-64
  • IA-64
  • 摩托罗拉68000
  • MIPS
  • PA-RISC
  • PDP-11
  • PowerPC的
  • R8C/M16C/M32C
  • SPU
  • 系统/ 390/z系列
  • 的SuperH
  • SPARC
  • VAX
  • A29K
  • ETRAX CRIS
  • D30V
  • DSP16xx
  • FR-30
  • FR-V
  • 英特尔i960
  • IP2000
  • M32R
  • 68HC11
  • MCORE
  • MMIX
  • MN10200
  • MN10300
  • 摩托罗拉88000
  • NS32K
  • 欢蹦乱跳
  • Stormy16
  • V850
  • Xtensa可
  • AVR32

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

  • 我很好奇您是否有一个特定的反例,其中指针和引用的实现方式不同。 (2认同)