假設在一個程序中我們已經實現了一個堆棧。但是誰創造了這個堆棧?它是處理器,操作系統還是編譯器?什麼創建堆棧?
什麼創建堆棧?
回答
如果您的意思是數據結構:處理器執行代碼。代碼調用操作系統來獲取堆棧的內存,然後將其操作以形成堆棧。編譯器只是將您編寫的代碼轉換爲處理器可以理解的代碼。
如果您指的是執行堆棧:操作系統負責將進程加載到內存中並設置其內存空間以形成堆棧。
您是否將程序執行堆棧與堆棧容器混淆?
你不能「執行」執行堆棧,操作系統會給你虛擬地址空間並在那裏找到你的堆棧指針,所以你只需按下並彈出它,你不會「創建它」,它在那裏你幾時開始。
你應該真的做出這個評論! – 2009-11-12 13:45:01
您的程序...它執行所需的程序集。編譯器根據所使用的calling convention代替該函數/函數調用插入該程序集。
瞭解調用約定可能是最有效的方法來回答你的問題。
堆棧是後進先出(LIFO)列表數據結構。程序執行時會根據程序執行要求將變量存儲,刪除。
如果您想實現自己的堆棧,請嘗試使用std :: stack <>。如果您正在討論本地變量所在的堆棧,那是由C++運行時系統創建的。
以上都不是。你在實現它時創建了它。編譯器只會將您的想法(用編程語言表達)轉換爲機器代碼或彙編代碼。處理器只運行您編寫的程序。操作系統(假設存在)提供了一些機制來幫助給你一個執行空間和內存來完成它,但你的程序決定了執行空間和內存中會發生什麼。
「假設在一個程序中我們已經實現了一個堆棧。」
然後,您在底層的低層數據結構(如數組)上實現它。您的堆棧=數組+函數(push(),pop())在數組上工作以提供堆棧功能。
「但是誰創建堆棧?它是處理器,操作系統還是編譯器?」
誰創建函數和數組?函數是由你創建的,然後編譯器將函數轉換爲機器指令並保持這些代碼可執行。另外,它會產生一組指令,爲陣列分配內存空間。所以你的程序是一個數組的指令和空間的混合。然後操作系統加載您的程序並將指令發送到處理器。處理器執行此指令並讀取/寫入數據到您的陣列。
假設你有一個測試C程序:
int square(int val) { int result; result = val * val; return(result); } int main(void) { int store; store = square(3); return(0); }
然後你就可以生產使用命令gcc -S test.c -o test.s
(如果你是一個Linux平臺上)編譯器生成彙編輸出。
縱觀生成的代碼只是square()
功能,我們得到:
square: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax imull 8(%ebp), %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax leave ret
你可以看到,編譯器生成的代碼來移動堆棧指針在例行的局部變量。
程序的初始化代碼將通過調用系統(操作系統)內存分配函數爲「堆棧」分配一定量的內存。然後由編譯的程序決定如何利用該區域的內存。
幸運的是,所有這些都由編譯器有效地處理,而不必考慮它(當然,除非標準堆棧大小的本地變量太大,在這種情況下您可能必須指示您的編譯器或線程庫從系統分配更多堆棧)。
假設在程序中我們已經實現了一個堆棧。但是誰創造了這個堆棧?
那麼如果你實現了它,那麼按照定義你創建它。你需要更具體的w.r.t.上下文。
標準運行時庫或鏈接器加載器創建堆棧。它是在你的main之前運行的一段代碼中完成的。鏈接器會自動插入此代碼,並在運行時運行,在調用main之前設置各種事情,例如任何靜態初始化的全局變量。它通常也設置堆棧,儘管一些操作系統將其放入操作系統代碼(鏈接器加載器),因爲他們想要在其系統上標準化堆棧實現/形狀。
堆棧被嵌入處理器,它是ESP寄存器,你需要學習,以understad堆棧
- 1. 創建堆棧CREATE_IN_PROGRESS
- 2. 全堆棧,堆棧交換等,什麼是堆棧?
- 3. 什麼「堆棧無效,堆棧只支持堆棧1和堆棧5」是什麼意思?
- 4. 在sml中創建堆棧
- 5. 從堆棧創建JSON
- 6. 爲什麼編譯器在堆棧上創建空間
- 7. 爲什麼D不允許在堆棧上創建對象?
- 8. 爲什麼使用兩個堆棧來創建一個隊列?
- 9. 堆棧/堆上的對象創建?
- 10. 什麼是堆棧跟蹤?
- 11. 爲什麼堆棧溢出?
- 12. 什麼在堆棧中?
- 13. 爲什麼堆棧有界?
- 14. 什麼是InfiniBand堆棧?
- 15. 什麼是硬件堆棧?
- 16. 什麼是堆棧跟蹤
- 17. 堆棧爲空...爲什麼?
- 18. 什麼是LAMP堆棧?
- 19. 什麼是jQuery堆棧?
- 20. 爲什麼堆棧炸燬
- 21. 什麼是Linux堆棧?
- 22. 什麼是「堆棧顛簸」?
- 23. 有什麼辦法可以創建Java Util棧的固定堆棧大小
- 24. 在堆或堆棧中創建構造函數的區別是什麼?
- 25. SDL爲什麼要在堆上創建紋理而不是堆棧
- 26. PyPy 1.7爲什麼不實現「無堆棧」堆棧?
- 27. C++堆棧/堆棧。爲什麼只有一個新操作員?
- 28. (Symfony 2.4)請求堆棧什麼是請求堆棧
- 29. 堆棧和堆棧幀有什麼區別?
- 30. 進程堆棧和CPU堆棧有什麼區別?
http://stackoverflow.com/questions/1612982/how-一點Win32彙編編程這並不直接回答你的問題,但它可能會爲你清楚一些事情,關於計算機如何工作。請閱讀這個問題,以及第二個投票答案(我寫的)。 – 2009-11-12 13:53:17
你的意思是執行堆棧的地址和局部變量的存儲位置?這是由操作系統創建的。在Linux上,execve()爲堆棧分配內存,而fork()也從父堆棧中複製內容。 – stribika 2009-11-12 13:54:36
堆疊精靈。他們住在北橋下。 – Crashworks 2009-11-12 21:12:48