簡體   English   中英

函數定義的順序對於C ++中的內聯是否很重要

[英]Is the order of function definitions important for inlining in C++

當一個函數調用另一個函數並且需要內聯時,這兩個函數的定義順序是否重要? 假設這兩個定義出現在同一個翻譯單元中。

我主要對C ++標准所說的內容感興趣,如果有的話。 但是,如果您有關於特定編譯器中的內聯行為的重要信息,我也會對此感興趣。 請假設沒有發生鏈接時優化(被禁用)。

具體來說,根據C ++標准,以下兩個版本是否同樣可以實現內聯?

第一版:

inline void foo() { ... }
void bar() { ... foo(); ... }

第二版:

inline void foo();
void bar() { ... foo(); ... }
void foo() { ... }

編輯:請注意,這個問題不是關於inline關鍵字在實現內聯方面的有效性。 我特別詢問標准是否說明了與實現內聯相關的函數定義的順序

C ++標准不會在此處進行任何拼版。 編譯器可以在任何他們認為合適的情況下自由內聯或不內聯。 除了允許同一函數的多個定義之外,inline關鍵字可能沒有任何效果。

大多數編譯器都能夠內聯翻譯單元可用的任何功能,無論它在源中出現的順序如何。 前向聲明通常只會影響源文件中給定點的可用名稱,而不會影響二進制文件的最終輸出。

實際上, inline關鍵字與內聯代碼的關系較少,而與允許legal violation一個定義規則有關。 內聯的主要目的是告訴編譯一個函數可能出現在多個翻譯單元中(並且每個翻譯單元中的定義都相同)。 這允許它避免鏈接階段的多個定義錯誤。

使用inline關鍵字並不能保證編譯器完全內聯函數 - 這只是一個建議。 此外,如果可以在翻譯單元中看到定義並且編譯器認為值得,則許多編譯器將內聯函數未標記為內聯。 我強烈懷疑你展示的任何一個版本都會被特定的編譯器內聯或不內聯。

簡而言之,讓編譯器決定是否內聯,並以最易讀的方式編寫代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM