2014-05-15 87 views
1

我是一個新手程序員。有這些線在我們的教科書,sumitha阿羅拉類12九版:內聯函數何時不起作用?

的內聯不會在下列情況下工作:

  1. 對於返回值,並具有環形或功能切換或轉到。

  2. 對於不返回值的函數,是否存在返回語句。

如果1和2是真的,那麼如何是內聯函數可能創造?

P.S.從書中的線是完全一樣的沒有改變

+0

請注意,內聯,僅僅是一個內聯請求。編制者沒有義務履行這一要求。不要認爲,如果您指定內聯並且符合您發佈的條件,那麼代碼將被內聯。 – cup

+0

你的意思是我們永遠不能說一個函數是否是內聯函數? – user3211362

+0

編譯器可以自由內聯或不內聯。一些編譯器有特殊的擴展來實際強制內聯函數,但除此之外,沒有辦法強制執行此操作。問題是爲什麼你會想要這樣做。通常,編譯器供應商知道什麼時候內聯某些東西。 – Jens

回答

1

我不知道本書中提到的編譯器。一般來說,它將取決於實際的編譯器,可以內聯哪些內容或什麼時候生成函數體。

這些陳述並不排除對方,因爲您可能會假設。 inhihbit內聯的一般條件是函數中的一個分支,除了簡單的if語句外。 (1)中的分支是循環和goto。在(2)的分支是跳轉到函數結束上return;

編輯

它是高度地依賴於編譯器。嵌套0​​可能工作。但switch語句不同,因爲它們通常使用跳轉表而不是幾個if語句來實現。跳轉表包含與goto標籤類似的位置。對於實際的編譯器來說這可能更困難。因此,區分可能是明智的。當碼是小且堆棧壓入/彈出佔用太多的開銷的

+0

如果語句可以工作,如果語句可以嵌套,還是太複雜?爲什麼不能切換語句工作? – user3211362

0

內聯函數基本上寫入。他們所做的是,他們擴大了他們寫作的地方。由於沒有關聯的推/關,所以你不能期望返回值。雖然,C++可以將簡單的函數轉換爲只有return語句的內聯函數。

這裏的一個C++代碼:

inline int max(int a, int b) 
{ 
    return (a > b) ? a : b; 
} 

然後,聲明如下列:

a = max(x, y); 

可被變換成一個更直接計算:

a = (x > y) ? x : y; 
+0

我們只能在類中使用內聯函數嗎? – user3211362

+0

您也可以使用內聯函數作爲類成員函數和非成員函數。見[this](http://www.cprogramming.com/tutorial/lesson13.html)和[this](http://www-01.ibm.com/support/knowledgecenter/SSGH3R_8.0.0/com.ibm。 xlcpp8a.doc /語言/ REF/inline_member.htm%23inline_member?LANG = EN)。 –

+0

如果他們認爲聯繫是默認外部的,那麼這是否意味着任何變化都不會反映出來? – user3211362

0

IMHO, C++標準沒有定義內聯限制。內聯函數定義在7.1.2.2節中:

帶有內聯說明符的函數聲明聲明瞭內聯函數 函數。內聯說明符向實現指示 函數體在調用點處的內聯替換應該是 ,而不是通常的函數調用機制。一個實現是 不需要在調用點執行這種內聯替換;

編譯器通常會有一些啓發式的方法來決定函數是否被內聯。這平衡了執行實際函數調用的成本(在堆棧上壓入參數,跳轉等)與具有更大函數的效果(最明顯的缺點是所產生的二進制文件的大小增加),但具體規則保持打開爲編譯器實現者。

如果本書不是在談論一個特定的編譯器,我看不到爲什麼這個聲明一般是真的。不過,這可能是一條經驗法則。