我需要定義內聯函數來提高我的代碼的性能。目前函數聲明在.h文件中,定義在.cpp文件中。我在每個函數聲明的前面添加了inline關鍵字,但是我收到了鏈接錯誤。是否可以分離內聯函數的聲明和定義?是否可以分離內聯函數的聲明和定義?
回答
使用一個單獨的「實現標題」,您仍將包含在任何地方?
您只需要指定一次原型或實現。兩者都符合資格。
根據定義,在編譯時必須知道內聯函數。 如果你想在一個單獨的.h文件中定義它們,你可以使用一個
的#pragma一次
把戲只能插入自己定義一次。
是的,但你必須把實現放在頭文件中。這是因爲爲了不加標題,在包含標題時必須知道定義。
如果這樣做,即使沒有inline
關鍵字,現代編譯器也會自動內聯函數。
你可以單獨聲明和定義罰款,但該定義必須在使用該功能的每個翻譯單元提供,例如:
#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基本上說,它必須是相同的無處不在,甚至超負荷的決議等
尼特:...在每個翻譯單元_that使用內聯函數_。 (嚴格來說,odr-uses) – 2012-07-11 08:19:35
@CharlesBailey - 好點,因爲原本措辭我有一個意想不到的意義,修復我希望現在。 – Flexo 2012-07-11 08:24:58
你絕對確保讓你的函數「內聯」會提高你的表現?我很確定它不會。
編譯器能夠內聯一些函數調用,當且僅當它可以看到內聯函數的主體。所以你需要包含函數的主體,但是如果這樣做,你不需要用'inline'來註釋你的函數,因爲編譯器只需要函數的主體 - 而不是你的'inline'關鍵字。現在的編譯器很聰明,並且知道是否以及何時內聯函數。內聯並不一定會提高程序的性能,而且很可能會增加可執行文件的大小。
見Herb Sutter的this article。他認爲關鍵字「inline」在C++中沒有意義。但我不同意他的看法。關鍵字「inline」有一個區別:你可以在程序中不止一次地指定內聯函數的主體(假設它每次都是完全相同的定義) - 當把函數體放入標題時這很有用(如果你需要的話這是出於任何原因)。
我發現在一些嵌入式工具鏈中,函數聲明中不允許使用#inline關鍵字。你可以在定義中指定它,但是(如上所述),許多編譯器無論如何都會忽略關鍵字。
- 1. 動態庫中定義的小函數是否可以內聯?
- 2. 內聯的定義和聲明
- 3. 在.h和.cpp文件中分隔定義和聲明時,是否可以內聯getter和setter?
- 4. 函數聲明和定義
- 5. 是否可以重寫內聯函數?
- 6. 是否可以在函數範圍內聲明/實現模板?
- 7. 爲什麼函數的定義與聲明分離?
- 8. 聲明和定義類成員函數內的函數對象
- 9. 是否可以將此SQL聯合聲明分解?
- 10. 是否可以使用css3聲明js事件和/或函數?
- 11. 是否可以在TypeScript中聲明和調用函數字典?
- 12. 內部函數聲明是否安全?
- 13. SFINAE消除,Constexpr和函數模板:我可以保持聲明和定義分離嗎?
- 14. 是否可以在函數調用方中聲明關聯數組?
- 15. 是否可以在REPL中定義固定聲明?
- 16. C++用靜態內聯聲明模板函數是否有意義?
- 17. 函數定義中的函數聲明
- 18. C++內聯函數調用函數可以在頭文件後面聲明嗎?
- 19. 風格:內聯函數聲明中
- 20. 如何顯式聲明內聯函數?
- 21. 是否可以製作自定義的renderscript內在函數?
- 22. 我如何可以聲明內定義的函數的類型讓
- 23. 函數定義聲明函數嗎?
- 24. 函數聲明/函數定義
- 25. 用於C++模板的聲明和定義分離
- 26. Objective-C消息是否存在方法聲明/定義分離的等價物?
- 27. 是否可以在接口中聲明一個私有函數?
- 28. 是否可以在GSP中聲明一個函數?
- 29. 源文件中定義的方法是否可以內聯?
- 30. 定義一個調用其他函數的內聯函數是否有意義?
這是某種僅限於Windows的技巧嗎? – 2012-07-11 10:11:51
不僅 請參閱http://en.wikipedia.org/wiki/Pragma_once 它可以讓你不必像#ifndef __MYHEADERH__ #define __MYHEADERH__等... – 2012-07-11 10:51:31