2016-09-09 42 views
0

衆所周知,對於內聯函數,只要它們被調用,編譯器就會用函數的主體「替換」函數的實際調用。內聯變量的語義

但是,在C++ 17中提出的內聯變量呢?他們的語義是什麼?

回答

1

正常情況下,必須爲函數和變量(爲它們分配空間,變量空間或函數體代碼)定義一次函數和變量。內聯函數放寬了這一點,以允許多個定義(因爲定義通過包含文件被拉入到多個模塊中),所有這些都必須相同。如果該函數是實際引用的,而不是內聯複製,則通過丟棄除一個副本以外的所有副本並使該副本成爲二進制中的正式副本來合併多個定義。

行內變量對於例如:靜態類成員。您不必創建一個只有內容爲單個成員變量定義的類的主體源文件,而是可以在類頭文件中定義靜態成員變量並生成多個定義(每個模塊包含一個類頭)將被合併到二進制文件中的單個實例中,而不會導致編譯器或鏈接器錯誤。

This paper discusses it in technical detail.

4

不,不能保證調用內聯函數實際上會導致函數被內聯。例如,如果內聯函數遞歸調用自身,那麼它可能不會被內聯。同樣,通過函數指針變量的調用通常不能被內聯。

如果一個內聯函數具有外部連接,然後連接,如果內聯函數在多個翻譯單位定義期間,鏈接器選擇含有定義的轉換單元中的一個,並解析所有剩餘的引用( ODR - 不是由編譯器內聯的),將該函數添加到所選翻譯單元中的定義中,放棄其餘定義。內聯變量的工作方式相同。