今日在論壇上看到如下關於引用的code。我一直以為我對於引用很了解,直到膝蓋中了一箭。
int val()
int& ref()
int main()
函式的彙編**如下
val函式返回變數i,直接把i放入eax。
ref函式返回變數i的引用,把i的位址放入eax。
區別和問題:
int vv = val(); // int <= int; 值傳遞
const int & rv = val(); // const int& <= int; 返回臨時變數,作用域為語句作用域。這樣的臨時變數,只能隱式轉化為常引用(const int&),不能為引用型別(int&)賦值。
檢視對應的彙編code,先把eax(返回值)存入棧上指定的位址上[ebp-20h],然後把[ebp-20]的位址存入eax,變數rv的值就是[ebp-20h]的位址。
int vr = ref(); // int <= int&; ref()返回退棧後的變數,有可能造成資料丟失。
檢視對應的彙編code,把eax中位址指向的內容賦值給eax,然後eax賦值給vr。
int & rr = ref(); // int& <= int&; rr引用退棧後的變數,很容易造成訪問衝突。
很多事情還是得看彙編code。。。。
從彙編角度看引用
引用型別到底是什麼?它和指標有什麼關係?它本身占用記憶體空間嗎?帶著這些疑問,我們來進行分析。先看 include include using namespace std void main 通過彙編檢視 如下 9 int x 1 00401048 mov dword ptr ebp 4 1 10 ...
從彙編看C 中的指標和引用
以前寫c 的時候,我認為指標是就是乙個存著另乙個變數位址的變數,他是有儲存空間的,而引用只是乙個變數的別名,不會占用儲存空間。最近在搞彙編,發現下面兩段 的生成的彙編 是一樣的 指標 void func 引用 void func 上面兩段 的生成的彙編都是 004019d0 push ebp 004...
從彙編的角度看C 裡的引用和指標
c 裡有引用和指標,使用過c 的應該都知道它們的異同點。本文將從彙編的角度去觀察這2者的本質。使用也非常簡單,在左側編寫c 在右側就會直接顯示對應的組合語言,也可以根據需要的平台來選擇對應的編譯器 我們使用的c 如下,比較簡單 int main void 選擇的編譯器是x86 64 gcc 9.2,...