我是一個新手程序員。有這些線在我們的教科書,sumitha阿羅拉類12九版:內聯函數何時不起作用?
的內聯不會在下列情況下工作:
對於返回值,並具有環形或功能切換或轉到。
對於不返回值的函數,是否存在返回語句。
如果1和2是真的,那麼如何是內聯函數可能創造?
P.S.從書中的線是完全一樣的沒有改變
我是一個新手程序員。有這些線在我們的教科書,sumitha阿羅拉類12九版:內聯函數何時不起作用?
的內聯不會在下列情況下工作:
對於返回值,並具有環形或功能切換或轉到。
對於不返回值的函數,是否存在返回語句。
如果1和2是真的,那麼如何是內聯函數可能創造?
P.S.從書中的線是完全一樣的沒有改變
我不知道本書中提到的編譯器。一般來說,它將取決於實際的編譯器,可以內聯哪些內容或什麼時候生成函數體。
這些陳述並不排除對方,因爲您可能會假設。 inhihbit內聯的一般條件是函數中的一個分支,除了簡單的if語句外。 (1)中的分支是循環和goto
。在(2)的分支是跳轉到函數結束上return;
編輯:
它是高度地依賴於編譯器。嵌套0可能工作。但switch
語句不同,因爲它們通常使用跳轉表而不是幾個if
語句來實現。跳轉表包含與goto
標籤類似的位置。對於實際的編譯器來說這可能更困難。因此,區分可能是明智的。當碼是小且堆棧壓入/彈出佔用太多的開銷的
如果語句可以工作,如果語句可以嵌套,還是太複雜?爲什麼不能切換語句工作? – user3211362
內聯函數基本上寫入。他們所做的是,他們擴大了他們寫作的地方。由於沒有關聯的推/關,所以你不能期望返回值。雖然,C++可以將簡單的函數轉換爲只有return語句的內聯函數。
這裏的一個C++代碼:
inline int max(int a, int b)
{
return (a > b) ? a : b;
}
然後,聲明如下列:
a = max(x, y);
可被變換成一個更直接計算:
a = (x > y) ? x : y;
我們只能在類中使用內聯函數嗎? – user3211362
您也可以使用內聯函數作爲類成員函數和非成員函數。見[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)。 –
如果他們認爲聯繫是默認外部的,那麼這是否意味着任何變化都不會反映出來? – user3211362
IMHO, C++標準沒有定義內聯限制。內聯函數定義在7.1.2.2節中:
帶有內聯說明符的函數聲明聲明瞭內聯函數 函數。內聯說明符向實現指示 函數體在調用點處的內聯替換應該是 ,而不是通常的函數調用機制。一個實現是 不需要在調用點執行這種內聯替換;
編譯器通常會有一些啓發式的方法來決定函數是否被內聯。這平衡了執行實際函數調用的成本(在堆棧上壓入參數,跳轉等)與具有更大函數的效果(最明顯的缺點是所產生的二進制文件的大小增加),但具體規則保持打開爲編譯器實現者。
如果本書不是在談論一個特定的編譯器,我看不到爲什麼這個聲明一般是真的。不過,這可能是一條經驗法則。
請注意,內聯,僅僅是一個內聯請求。編制者沒有義務履行這一要求。不要認爲,如果您指定內聯並且符合您發佈的條件,那麼代碼將被內聯。 – cup
你的意思是我們永遠不能說一個函數是否是內聯函數? – user3211362
編譯器可以自由內聯或不內聯。一些編譯器有特殊的擴展來實際強制內聯函數,但除此之外,沒有辦法強制執行此操作。問題是爲什麼你會想要這樣做。通常,編譯器供應商知道什麼時候內聯某些東西。 – Jens