簡體   English   中英

調用棧圖

[英]The call stack drawing

   void main() {
           int a = 10;
           int b = 37;
           swap(&a, &b);
           cout << "a = " << a << endl;
           cout << "b = " << b << endl;
    }
    void swap (int* a, int *b) {
            int temp = *a;
            *a = *b;
            *b = temp;
    }

嗨,我有一個這樣的程序。 我想畫一張詳細描述調用堆棧的圖片,但我不知道我是否理解正確。 給我建議,如果我錯了你能改正嗎?

| local of spam() *b=temp       |
| local of spam() *a=*b         |
| local of spam() <int> temp=*a |
| Local variables adress of a, b| // example  0x100 a , 0x102 b
| return adress of swap()       |
| call Swap                     |
| Parameter a,b                 |
| Local variables a =10 ,b = 37 |

 

您的總體思路是正確的,但細節取決於實現 - C++ 標准本身未指定它們,它們也可能因編譯器優化設置而異。 您期望在堆棧上的許多東西可能只是放在 CPU 寄存器中(實際上,編譯器使用的調用約定可能要求它通過寄存器將某些 arguments 傳遞給函數,而其他函數則通過堆棧傳遞)。 只有數據進入堆棧,而不是操作。

盡管如此,正如我所說,您通常可以很好地想象它對於高級編程的一般心理 model 的目的。 您的 model 中不太正確的是:

  • " return address of swap() " / " call Swap " -> 按時間順序,調用 function 返回時需要執行的下一個地址通常會保存在某處(堆棧或特定寄存器)在調用之前(如果沒有 CPU call指令,並且實際使用了jump指令,則尤其常見),或者由 CPU 的調用指令本身

    • 因此,以相反的順序列出它們會更准確,或者完全省略call Swap
  • 在調用之前或調用時可能還有其他 CPU 寄存器要保留,或者在某些 CPU 上存在 CPU 寄存器的“窗口”,調用在調用時移入和移出並返回; 很多細微的變化,但對於您作為 C++ 程序員的高級理解並不重要

  • " local of spam() *a=*b " / " local of spam() *b=temp " 不會有與那里的賦值相關的堆棧使用; 您已經提到地址可以通過“ Local variables adress of a, b的堆棧傳遞

(如果您想要更深入的了解,請使用 gdb 之類的調試器來檢查整個程序執行過程中的堆棧)。

暫無
暫無

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

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