1樓:
行內函數能短三五行**量沒迴圈。
簡單說短程式重複呼叫函式。
2樓:府苑泣悅人
用編譯器**解析或者自己寫個程式驗證下,最簡單的方法就是寫個程式看反彙編後的**了。
不用inline修飾的函式是否會被編譯器作為inline處理
3樓:老男孩
行內函數從源**層看,物跡有函式的結構,而在編譯後,卻不具備函式的性羨螞乎質。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在**中用inline修飾,但兄悉是否能形成行內函數,需要看編譯器對該函式定義的具體處理。
百科的。哈哈。
c++中行內函數何時被編譯器禁止
4樓:砍侃看
當行內函數的函式體很大時,編譯器不會按照行內函數進行編譯,按普通函式進行編譯。
不顯式宣告為行內函數,編譯器會自動設為內聯嗎
5樓:風若遠去何人留
不會的編譯器不會那麼做。
不被宣告為inline的, 編譯器不可能按照inline處理而宣告為inline的,是否真的會處理為內聯, 還要看編譯器判斷。
也有可能不是的。
行內函數是否必須要乙個return語句? 其是否必須通過編譯器來實現?
6樓:網友
1. 否。2. 函式本身當然是你實現,內聯這件事情是編譯器實現。
乙個函式能否即是虛擬函式又是行內函數?
7樓:她是我的小太陽
通常,乙個行內函數是被的。
class cfoo
int setval(int v)
這裡,如果使用下列**:
cfoo x;
int y = ;
那麼編譯器產生的目標**將與下面的**段一樣:
cfoo x;
int y = ;
虛擬函式有多型性,意味著派生的類能實現相同的函式,但功能卻不同。假設 getval 被宣告為虛擬函式,並且有第二個 以不同方法實現的類 cfoo2:
class cfoo2 : public cfoo
如果 pfoo是乙個 cfoo 或 cfoo2 指標,那麼,無論 pfoo 指向哪個類 cfoo 或 cfoo2,成員函式 pfoo->getval 都能呼叫成功。
有兩種方式建立行內函數。
第一種是在函式定義中使用關鍵字 inline,如:
inline cfoo::getval()
第二種是在類的宣告中編寫函式體,就象前面的 cfoo2::getval 一樣。所以如果將虛擬函式體包含在類的宣告中,如:
class cfoo
最好不要使用內聯虛擬函式,因為它們幾乎不會被,即便你的函式只有一行,最好還是將它與其它的類函式一起放在模組(cpp檔案) 中。當然,開發者常常將簡短的虛擬函式放在類宣告中-不是因為他們希望這個函式被為內聯,而是因為這樣做更方便和可讀性更強。
8樓:搞笑點
當然不能,虛擬函式意味在執行期確定函式的呼叫位址,行內函數如同巨集的用法一樣,相當於在編譯期把呼叫內聯的地方加上了函式實現的**。前者是動態的,後者是靜態的。
另外,即使編譯器通過了編譯,那麼函式也不可能是內聯的。
9樓:網友
純粹扯淡,有內聯虛擬函式之說的,參考。
不要誤導。
10樓:焉湉湉
不行虛擬函式需要執行時繫結,如果能內聯怎樣繫結?
11樓:苯寶寶不笨
乙個函式不可以既是虛擬函式又是行內函數。
嚴格的說法是:就算能建立內聯虛擬函式,或者說虛擬函式被宣告為行內函數,編譯器遇到這種情況根本不會把這樣的函式內聯,而是當做普通函式來處理。編譯器拒絕乙個非虛行內函數,c++編譯器常常首先會報錯:
內聯中斷-函式太大」。如果行內函數呼叫自身,或者在某處傳遞其位址,編譯器必須產生乙個正常(外聯)函式。對於內聯虛擬函式,編譯器將把它看做普通的虛擬函式。
應用中最好不要使用內聯虛擬函式,因為它們幾乎不會被。實際中開發者常常將簡短的虛擬函式放在類宣告中,這樣做的目的不是希望這個函式被為內聯,而是因為這樣做程式看起來更方便和可讀性更強。
行內函數的定義對編譯器而言必須是可見的?什麼意思?
12樓:
解答其實已經說得很清楚了,編譯器在看到程式中呼叫普通函式的**時,是在這裡填乙個函式的位址,然後在執行時跳轉到函式那邊去。而碰到行內函數時,是將函式的內容全部在呼叫點,所以它必須知道這個行內函數的定義是什麼,否則無法。而將行內函數的定義放在標頭檔案(.
h)中,一旦include了該標頭檔案,就能看到行內函數的全部內容了,也就可以在呼叫點完全行內函數。如果將行內函數放在原始檔中(.c),編譯器在看到行內函數的呼叫時,是無法知道行內函數的內容的,因此也無法,所以必須將行內函數定義在標頭檔案中。
13樓:匡懷玉
這個你都不知道什麼意思嗎。
有行內函數被編譯為dll,內聯是否失效
14樓:手機使用者
1. inline 關鍵字, 只是建議編譯器按內聯處理, 編譯器不一定將該函式按內聯處理。
2. 行內函數不是真正意義的函式。 它不會被編譯成函式, 也就不會在編譯成的dll中。 你可以把行內函數理解成具有型別檢查功能的巨集。
3. 使用行內函數,需要包含其實現**(函式體), 因此一般都將其函式體寫在標頭檔案中。 如果不這麼做, 當你在其他模組中呼叫該行內函數時, 你將面臨麻煩。
你就必須要包含行內函數體所在的檔案(.cpp )檔案。
表述也許不太清楚, 有問題可以。
函式定義與實現寫在一起就叫行內函數嗎?如下簡單**。
15樓:網友
行內函數是一種編譯提示,注意是給編譯器的「提示」,並不能保證你想內聯就內聯。有inline的關鍵字去提示編譯器可以內聯,但編譯器實際上是否內聯,還取決於這個函式的複雜程度,如果過於複雜比如有迴圈,就不會內聯了。而且跟你說的宣告和實現寫在一起沒太大關係,只是在類定義裡寫方法體的話,等於加了inline的關鍵字。
16樓:緣來丶緣淺
c++內斂函式是類中使用的乙個很強有力的概念。如果乙個函式被宣告為內斂函式,編譯器在編譯的時候就會在函式呼叫的地方將函式的實現**拷貝乙份。
如果內斂函式發生改變,那麼客戶端都需要重新編譯,因為編譯器需要將內斂函式的副本重新在呼叫的地方拷貝乙份。
要宣告內斂函式的話,需要使用關鍵字inline,放在函式名之前。需要注意的是,加上關鍵字inline,程式本身只能「請求」將該函式宣告為內斂函式,具體能不能真正變成內聯是由編譯器決定的。
類中定義的函式都是以行內函數定義的方式實現的,即使它們沒有加上關鍵字inline。另外,行內函數的函式的宣告和實現是在一起的,不能夠分開,因為在執行的時候,是將**進行替換的。而且,一般來說,行內函數是定義在標頭檔案之中的。
樓主給出的**是乙個簡單的c++檔案,並沒有用到內聯。如果在func前加上關鍵字inline,則是將其定義為了inline函式。行內函數的生命和實現是在一起的,也就不存在實現部分放在main()函式後面的問題了。
初學C選擇哪個編譯器比較合適,C 編譯器哪個比較好?
初學c 的話,應該把精力放在c 本身上,其實只要用熟一種就可以,不用糾結。建議直接使用visual studio的express版本,免費 輕量 好用,文件也豐富,號稱宇宙第一ide,值得擁有 vc 6.0 這個比較好,簡單適用 用linux的環境,用g 直接寫makefile c 編譯器哪個比較好...
目前主流的C編譯器有哪些C的編譯器都有哪些啊?謝謝!!!!
c 編譯器主要有 抄 ms的 visualc 對最新的c 標準襲支援的一般般。遵循gpl協議的gcc下的g 編譯器 遵循bsd協議的llvm clang 編譯器後兩者對新標準的支援比較好。windows下一般的開發使用 的 c 對效能要求非常高的才使用c c 無所謂好壞。bai主流編譯器都可du 以...
新人學C 用什麼編譯器好
最常用的是vs2003和vs2005 2008目前還沒什麼公司使用,多半是個人。另外2003在裝的時候經常出現莫名其妙的問題就裝不起。2005不會,並且2005有很多方便的熱鍵可以用,不過2005帶有智慧感知,可以幫你補充上你可能需要的資料。但是如果你使用va外掛幫助程式設計的話,會比2005自帶的...