簡體   English   中英

指針和引用之間的低級差異是什么?

[英]What's the low-level difference between a pointer an a reference?

如果我們有這個代碼:

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

參考數據和指針數據之間沒有實際的二進制差異。 (它們都包含foo內存中的位置)

第2部分

那么指針和引用( 這里討論)之間的所有其他差異在哪里出現? 編譯器是執行它們還是它們在可組合級別上實際上是不同類型的變量? 換句話說,下面是否生成相同的匯編語言?

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

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

從理論上講,它們可以以不同的方式實施。

在實踐中,我見過的每個編譯器都編譯指針和對同一機器代碼的引用。 區別完全在語言層面。

但是,就像cdiggins所說,在你驗證它對你的編譯器和平台是正確的之前,你不應該依賴於這種推廣。

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

現在乘以操作系統和優化標志,您可能會發現每個人的體驗都非常缺乏。

指針和引用在C ++中具有不同的語義,但生成的代碼是相同的。

只是為了放大,雖然引用可能與幾乎所有編譯器下的引擎相同,但依賴於該行為是一個嚴重的錯誤。 當你最不期望它時,它不僅可能會咬你的屁股,而且也錯誤地使用引用。 如果它是您需要的指針,請使用指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM