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

2022-07-27 16:05:45 字數 2163 閱讀 4737

1樓:愛德iv菠蘿

我個人的見解是這樣的,陣列因為在定義的時候確定了陣列的大小所以編譯器才可以為其分配記憶體。函式名和陣列名就是記憶體的首地址,所以函式名是代表的入口地址,當你主程式真正呼叫的這個函式時候,才會為從入口地址進入,並且為這個分配其確定大小的記憶體。事先不執行的記憶體都是為空,不為其分配,只有用到了並且明確了其所需多少記憶體時候才會分配。

比如說一個函式僅僅定義了它,在沒用在呼叫它的時候系統是不能知道所佔用的記憶體,並且沒必要去開闢記憶體。只有執行到需要呼叫的,只需要如函式名(即入口的記憶體地址)開始分配並呼叫即可。

至於編譯為什麼能分配記憶體,這個是由作業系統和編譯器共同完成,記憶體是動態變化的,所以第三方使用者的程式使用的記憶體是執行時候系統和編譯器臨時給的地址。

這是鄙人的一些見解,如有不對請指出

2樓:匿名使用者

程式在記憶體中分為四部分

**段 (程式**,比如你的函式)

靜態段 (存放靜態變數和全域性變數,還有用到的字面值常量)

堆 (由程式設計師自己管理的記憶體,動態分配用的就是這部分記憶體) //動態分配的陣列在這裡

棧 (由作業系統管理,區域性變數和臨時變數存在這裡) //自己定義的陣列在這裡

現在你應該知道自己定義的普通陣列在**,動態分配的陣列又在**了吧.

呼叫函式時都是值傳遞,就是把變數的值複製一份給函式這時就會新分配一塊記憶體給函式中

接收這個值的那個變數,當函式結束時,這個變數被釋放

引用呼叫不是值傳遞,而是讓函式直接操作你傳遞的實參

高階一點: 引用其實也是值傳遞這種方式,只不過編譯器偷偷給你變成了指標

c++中,只是宣告一個函式而不定義,編譯時會不會產生與之相對應的命令**?

3樓:匿名使用者

如果沒有函式呼叫的話,編譯器恐怕不會產生任何**……

如果有呼叫的話,會產生呼叫函式的**,至於函式的實現在**,那不是編譯器要考慮的事,連結器才需要查詢函式的實現**並與函式呼叫**對上……

4樓:匿名使用者

不會產生**,也不會出錯。就算語言規定預設定義的建構函式如果不使用不會產生**的。

誰知道c++編譯器會為類新增哪些成員函式

5樓:手機使用者

條款45: 弄清c++在幕後為你所寫、所呼叫的函式

一個空類什麼時候不是空類?當c++編譯器通過它的時候。如果你沒有宣告下列函式,體貼的編譯器會宣告它自己的版本。

這些函式是:一個拷貝建構函式,一個賦值運算子,一個解構函式,一對取址運算子。另外,如果你沒有宣告任何建構函式,它也將為你宣告一個預設建構函式。

所有這些函式都是公有的。換句話說,如果你這麼寫:classempty{};和你這麼寫是一樣的:

classempty;對於這個問題,好像早有讀者向書的作者scott meyers提出了疑問,scott meyers也認為上邊的答案是有問題的.正確的結果應該是:classempty另外,需要注意的是隻有當你需要用到這些函式的時候,編譯器才會去定義它們。

宣告一個空類,大家都認為會生成

建構函式、拷貝建構函式、解構函式、賦值運算子號;

其實對於這樣的一個空類來說,是完全沒有必要的,而編譯器也不是這樣做的。是我們太低估編譯器給我們做的工作了,我們用vc編譯器來說明一下。

classa;對於單獨申明的一個空類a來說,編譯器編譯過程中,並沒有發現建立a例項。所以對於空類a來說,編譯器是不會給類a生成任何函式的;如果我們在**中需要生成一個a的例項,比如a a;編譯器就會根據上面的例項,給類a生成建構函式和解構函式。 當使用a b(b);編譯器就會生成類a的拷貝建構函式;a c;c = a;編譯器生成賦值運算子函式;

a &d = a;

編譯器生成取地址運算子函式。

經過分析可以這樣理解:

對於一個沒有例項化的空類,編譯器是不會給它生成任何函式的,當例項化一個空類後,編譯器會根據需要生成相應的函式。這條理論同樣適合非空類(只宣告變數,而不宣告函式)。

c++定義在類裡面的函式,如果編譯器一定將他內聯處理嗎? 100

6樓:gta小雞

inline關鍵字只是一個提示,告訴編譯器應該將此函式內聯處理,最終是否內聯取決於編譯器優化策略,如果一個函式過長,即使宣告為行內函數,編譯器也可以不內聯處理。

常見的c語言編譯器是什麼,常見的C語言編譯器是什麼?

1.c語言程式設計軟體有哪些 mcrosoft visual c microsoft visual studio dev c code blocks borland c watcom c borland c builder gnu djgpp c lccwin32 c compiler3.1 hig...

對於初學者哪個編譯器比較好,C編譯器哪個比較好?

1.c語言程式設計軟體有哪些 mcrosoft visual c microsoft visual studio dev c code blocks borland c wat c borland c builder gnu djgpp c lccwin32 c piler3.1 high c tu...

什麼C c語言編譯器好,C 是什麼程式語言

有個小巧的ide叫 dev cpp,可以試試 另外 可以選擇 codeblocks,the open source,free c ide org 還可以用 eclipse ide for c c developers,在win下,可以用vc的編譯器,也可以在用gcc 通過結合mingw 寫linux...