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

时间:2009-10-28 21:52:01

标签: c++ pointers assembly reference

如果我们有这个代码:

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 个答案:

答案 0 :(得分:18)

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

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

但是,就像cdiggins所说,在你验证它对你的编译器和平台是正确的之前,你不应该依赖这个概括。

答案 1 :(得分:10)

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

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

考虑以下list of C++ compilers

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

现在将此列表乘以以下short list of machine architectures

  • ARM
  • Atmel AVR
  • Blackfin
  • HC12
  • H8 / 300
  • IA-32(x86)
  • x86-64
  • IA-64
  • Motorola 68000
  • MIPS
  • PA-RISC
  • PDP-11
  • PowerPC
  • R8C / M16C / M32C
  • SPU
  • System / 390 / zSeries
  • SuperH
  • SPARC
  • VAX
  • A29K
  • ARC
  • ETRAX CRIS
  • D30V
  • DSP16xx
  • FR-30
  • FR-V
  • Intel i960
  • IP2000
  • M32R
  • 68HC11
  • MCORE
  • MMIX
  • MN10200
  • MN10300
  • Motorola 88000
  • NS32K
  • ROMP
  • Stormy16
  • V850
  • Xtensa
  • AVR32

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

只是为了放大,虽然引用可能与几乎所有编译器下的引擎相同,但依赖于这种行为是一个严重的错误。当你最不期望它时,它不仅可能会咬你的屁股,而且也错误地使用引用。如果它是你需要的指针,请使用指针。