當前位置:首頁 » 編程軟體 » 進入編譯器後一個函數經歷了什麼

進入編譯器後一個函數經歷了什麼

發布時間: 2022-05-02 19:42:58

⑴ C++中編譯時遇到函數的定義,編譯器做了哪些事,

程序在內存中分為四部分
代碼段 (程序代碼,比如你的函數)
靜態段 (存放靜態變數和全局變數,還有用到的字面值常量)
堆 (由程序員自己管理的內存,動態分配用的就是這部分內存) //動態分配的數組在這里
棧 (由操作系統管理,局部變數和臨時變數存在這里) //自己定義的數組在這里

現在你應該知道自己定義的普通數組在哪裡,動態分配的數組又在哪裡了吧.

調用函數時都是值傳遞,就是把變數的值復制一份給函數這時就會新分配一塊內存給函數中
接收這個值的那個變數,當函數結束時,這個變數被釋放
引用調用不是值傳遞,而是讓函數直接操作你傳遞的實參
高級一點: 引用其實也是值傳遞這種方式,只不過編譯器偷偷給你變成了指針

⑵ 被C編譯器編譯後的函數是什麼,編譯後的東西是什麼

這個還真忘了 不過在C的 目錄下面可以找到的
與你的程序文件名一樣 只不過擴展名不一樣 我記得會有個EXE文件的 雙擊就執行你之前寫的程序 那時候剛學編程 還覺得挺好玩的

⑶ 精品賞析:一個.NET程序在編譯和運行時都做了些什麼

run-time)和運行原理 (CPU-specific binary or pseudo-code)的疑問。 這里是一個簡單的回答:當你編譯一個C#應用程序或任何一種CLS(Commmon Language Specification)兼容的語言時,它將首先被編譯成一種稱為IL (Intermediate Language)的偽代碼(pseudo-code)。在這個應用程序第一次 被運行的時候,這種IL代碼將被編譯成機器代碼,用於執行。也就是說從源代碼 到得到運行結果,進行了兩次編譯。事實上,只有那些被真正使用的函數代碼 才會被進行第二次編譯。下面揭示開發過程中被隱藏起來的細節: 1) 你用C#開發一些程序 2) 用C#編譯器或CLS兼容的編譯器編譯成EXE 3) 編譯器將生成的IL代碼和附加信息(manifest)放入擁有一個標准PE頭的Win32 可執行文件的只讀部分。 4) 編譯器在創建這個可執行文件時導入(import)一個名為_CorExeMain的函數。 這個函數是.NET EE(execution engine)--.NET運行期引擎的入口函數。 5) 當執行這個Win32可執行文件時,因為其主要是依賴於DLL的PE文件,操作系 統將會調用位於MSCorEE.DLL中的_CorExeMain函數。 6) 操作系統通過PE文件里的進入點,調用MSCorEE.DLL。並能保證在Windows里 可以有很多程序同時運行。 7) 因為操作系統不能執行.NET IL代碼,EXE里的進入點只是簡單的中介,它將 指示操作系統調用_CorExeMain函數。 8) 隨後_CorExeMain函數開始解釋位於PE文件中的IL代碼。 9) 因為IL是不能被直接執行的, .NET EE使用稱為JITter (Just In Time compiler) 這一即時編譯過程只在第

⑷ 請問編譯器是通過函數的入口地址來找到函數,那又是如何知道函數的結束呢

函數入口是一段指令的首地址,進入函數實際是從這段指令開始執行,執行到return語句,函數就結束了

⑸ 一直有個疑惑,C/C++編譯器是如何調用函數的

函數的調用就是 跳轉到函數體的入口地址。

函數體本身的存儲空間是在exe里txt段,然後運行載入的時候映射到地址空間。不過看你的問題,你關注的不是這個的佔用。

關於你問的問題, 其實是因為一旦定義了虛函數,在C++類型的頭部,就會有一個指針的隱藏變數被定義,從而該類型的每個對象都會有這個變數的大小。 這個只有類型有和沒有虛函數的區別,虛函數的個數造成內存增長只是虛表裡(每class一個),每個對象里只是存的一個指針,不會有size變化。

對於非虛的函數,編譯的時候,直接就是填寫的函數體的入口地址; 而虛函數,則是要經過計算,先通過對象頭部寸的虛表指針找到虛表,再去找對應的虛表項 ,裡面存儲的就是需要的函數的入口地址。

建議樓主看看 C++布局方面的書,比如 <Inside C++ Object Model>, 以及平時多用VS操練一下調試技巧,然後適當熟悉簡單的匯編代碼,對融會貫通很有幫助。

⑹ 簡單說一下編譯程序怎樣編譯一個函數

高級語言在編譯的時候,編譯器會生成匯編,進而生成二進制文件.

高級語言編譯函數,先把函數的形參壓棧(有時候還有狀態寄存器等),再分配聲明的局部變數的內存空間,然後是函數處理,最後是出棧.

⑺ c++編譯後產生的一些文件是什麼

c++程序在編譯後,在目標路徑下會生成多個文件:

Debug文件夾(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg。

1、exe:是生成的可執行文件。

2、ilk:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息。

3、obj:是目標文件,源程序編譯後的產物。

4、pch:全稱是PreCompiled Header,就是預先編譯好的頭文件。

5、idb:文件保存的信息,使編譯器在重新編譯的時候只重編譯最新改動過的函數和只對最新類定義改動過的源文件進行重編譯,以提高編譯速度。

6、pdb:全稱是Program DataBase,即程序資料庫文件,用來記錄調試信息。

(7)進入編譯器後一個函數經歷了什麼擴展閱讀:

工作原理:

C++語言的程序因為要體現高性能,所以都是編譯型的。但其開發環境,為了方便測試,將調試環境做成解釋型的。即開發過程中,以解釋型的逐條語句執行方式來進行調試,以編譯型的脫離開發環境而啟動運行的方式來生成程序最終的執行代碼。

生成程序是指將源碼(C++語句)轉換成一個可以運行的應用程序的過程。如果程序的編寫是正確的,那麼通常只需按一個功能鍵,即可搞定這個過程。該過程實際上分成兩個步驟。

第一步是對程序進行編譯,這需要用到編譯器(compiler)。編譯器將C++語句轉換成機器碼(也稱為目標碼);如果這個步驟成功,下一步就是對程序進行鏈接,這需要用到鏈接器(linker)。鏈接器將編譯獲得機器碼與C++庫中的代碼進行合並。

⑻ c++的一個自己設立的函數 返回臨時變數時 編譯器都做了什麼,比如傳值調用,編譯器會生成一個變數的副本

編譯器在函數運行到函數內部的時候給變數分配了內存,但函數結束後此變數就被系統銷毀了,函數要返回此變數的值存在緩沖區中。

⑼ C++編譯器如何解析函數

這個過程是一個相當復雜的過程。以一個簡單的函數為例子。int max(int x,int y)。這個函數求兩個變數當中的較大值,在執行的時候首先將參數y,x的值入棧。入棧之後開始執行函數體當中的代碼。當執行到return語句的時候,會將計算的結果保存在eax寄存器當中,調用該函數的地方從這個地方讀取值。具體的內容可以參考《程序員的自我修養》的後部分。

⑽ 程序的編譯鏈接過程

stdio.h 只是一個函數聲明的頭文件, 實現在已經編譯好的庫文件中,一般情況 IDE 會自動連接標准庫,不需要你管。

熱點內容
php花生 發布:2025-05-14 12:54:30 瀏覽:549
java人才 發布:2025-05-14 12:29:10 瀏覽:649
如何打開軟密碼 發布:2025-05-14 12:28:55 瀏覽:427
七牛存儲待遇 發布:2025-05-14 12:27:20 瀏覽:422
C語言a35a4a5 發布:2025-05-14 11:53:48 瀏覽:813
android隱藏item 發布:2025-05-14 11:43:56 瀏覽:328
javawebeclipse編譯 發布:2025-05-14 11:35:24 瀏覽:938
可編程式控制制器試題 發布:2025-05-14 11:25:32 瀏覽:122
dsp混合編程 發布:2025-05-14 11:23:10 瀏覽:250
mysql添加存儲過程 發布:2025-05-14 11:23:01 瀏覽:882