2012-07-11 106 views
4

我需要定義內聯函數來提高我的代碼的性能。目前函數聲明在.h文件中,定義在.cpp文件中。我在每個函數聲明的前面添加了inline關鍵字,但是我收到了鏈接錯誤。是否可以分離內聯函數的聲明和定義?是否可以分離內聯函數的聲明和定義?

回答

1

使用一個單獨的「實現標題」,您仍將包含在任何地方?

1

您只需要指定一次原型或實現。兩者都符合資格。

1

根據定義,在編譯時必須知道內聯函數。 如果你想在一個單獨的.h文件中定義它們,你可以使用一個

的#pragma一次

把戲只能插入自己定義一次。

+0

這是某種僅限於Windows的技巧嗎? – 2012-07-11 10:11:51

+0

不僅 請參閱http://en.wikipedia.org/wiki/Pragma_once 它可以讓你不必像#ifndef __MYHEADERH__ #define __MYHEADERH__等... – 2012-07-11 10:51:31

1

是的,但你必須把實現放在頭文件中。這是因爲爲了不加標題,在包含標題時必須知道定義。

如果這樣做,即使沒有inline關鍵字,現代編譯器也會自動內聯函數。

4

你可以單獨聲明和定義罰款,但該定義必須在使用該功能的每個翻譯單元提供,例如:

#include <iostream> 

inline void foo(); 

int main() { 
    foo(); 
} 

inline void foo() { 
    std::cout << "Hi\n"; 
} 

是完全合法的,正確的。


從n3290§7.1.2.4確切的報價是:

內聯函數必須在每一個翻譯單元中,它是ODR-使用,而且必須具有完全相同 相同的定義中定義每個案例(3.2)。 [注意:在翻譯單元中出現 定義之前,可能會遇到對內聯函數的調用。末端注]

凡§3.2基本上說,它必須是相同的無處不在,甚至超負荷的決議等

+1

尼特:...在每個翻譯單元_that使用內聯函數_。 (嚴格來說,odr-uses) – 2012-07-11 08:19:35

+0

@CharlesBailey - 好點,因爲原本措辭我有一個意想不到的意義,修復我希望現在。 – Flexo 2012-07-11 08:24:58

2

你絕對確保讓你的函數「內聯」會提高你的表現?我很確定它不會。

編譯器能夠內聯一些函數調用,當且僅當它可以看到內聯函數的主體。所以你需要包含函數的主體,但是如果這樣做,你不需要用'inline'來註釋你的函數,因爲編譯器只需要函數的主體 - 而不是你的'inline'關鍵字。現在的編譯器很聰明,並且知道是否以及何時內聯函數。內聯並不一定會提高程序的性能,而且很可能會增加可執行文件的大小。

見Herb Sutter的this article。他認爲關鍵字「inline」在C++中沒有意義。但我不同意他的看法。關鍵字「inline」有一個區別:你可以在程序中不止一次地指定內聯函數的主體(假設它每次都是完全相同的定義) - 當把函數體放入標題時這很有用(如果你需要的話這是出於任何原因)。

+0

好的答案 - 我會說關鍵字'inline'在C++中有一個含義和用法,但它與編譯器對同名的優化無關。 – Flexo 2012-07-11 08:25:48

+1

+1爲鏈接到藥草 – triclosan 2012-07-11 08:45:47

0

我發現在一些嵌入式工具鏈中,函數聲明中不允許使用#inline關鍵字。你可以在定義中指定它,但是(如上所述),許多編譯器無論如何都會忽略關鍵字。

相關問題