[英]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.