編譯器如何處理宏內聯函數以減少執行時間?宏和內聯函數在執行速度方面有什麼區別?
4
A
回答
0
應該沒有速度差異(假設合理的小代碼),因爲它們都會被編譯到它們被使用/調用的地方。它只是更好的使用函數的做法,因爲宏可以有一種做事情的方式。
1
內聯函數與宏非常相似,因爲它們都在編譯時展開,但宏由預處理器擴展,而內聯函數由編譯器解析。
10
編譯器還允許不內聯函數,如果這樣做會更快,而編譯器無法不內聯宏。另外,內聯函數比宏更安全。
1
這裏要注意的最重要的事情是,宏純文本替換由預處理器完成。編譯器(在預處理步驟之後)不知道或關心宏是什麼。
實施例:
//this:
#define PRINT(s) std::cout << s;
int main(int, char**)
{
PRINT("hello world")
return 0;
}
//Will have identical codegen(in the same compiler version of course) to this:
int main(int, char**)
{
std::cout << "hello world";
return 0;
}
對於內聯函數然而,當對函數的調用內聯的編譯器知道,它具有大約它的使用更加上下文信息。正如其他人所說,這也意味着這是一個要求。如果編譯器認爲內聯函數更有害,那麼它會將其作爲常規函數調用保留。與宏對比,編譯器在使用宏時沒有關於代碼重複的信息。
總之,如果你的代碼可以使用內聯函數,那麼使用它代替宏。您正在幫助編譯器通過提供更多信息來使您的代碼更好。
0
Inline Function Macros
- 內聯函數由編譯器解析| 1.宏由預處理器處理。
- 內聯函數可以寫在裏面| 2.宏不能寫入裏面。 這個班。 |
- inline執行strick類型檢查| 3.宏不執行嚴格的檢查。
- 內聯函數按關鍵字進行。 | 4.宏在哪裏進行#include | ,定義。
- 包含參數的內聯函數是| 5.包含表達式的宏必須被 處理過一次,然後可以使用許多|每次使用時都要進行處理。 時間。 |
1
此外,MACROS無法訪問類成員變量。它不瞭解範圍。在這裏,內聯函數會很有用。
0
內聯函數遵循所有在正常函數上執行的類型安全協議。
內聯函數使用與任何其他函數相同的語法來指定,除了它們在函數聲明中包含內聯關鍵字。
作爲參數傳遞給內聯函數的表達式被評估一次。在某些情況下,作爲參數傳遞給宏的表達式可以被多次計算。
要記住的另一件事是宏在預編譯時擴展,所以你不能使用它們進行調試。但是,對於內聯函數,情況並非如此。
範圍在宏的情況下是全局的,局部範圍可以應用於內聯函數。
0
內聯函數遠比宏更好。例如,如果內聯函數的大小足以減慢代碼的執行速度,那麼編譯器不會將它內聯到宏,因爲在宏上沒有這種檢查
相關問題
- 1. MouseEvents或TouchEvents,執行速度有什麼區別?
- 2. Rust中的宏和函數有什麼區別?
- 3. 定義一個函數內聯與否有什麼區別?
- 4. typedef和宏之間有什麼區別?
- 5. 內聯函數和靜態內聯函數之間的區別
- 6. 內容長度和數據長度有什麼區別?
- 7. 函數getAddUrl和getAddToCartUrl有什麼區別?
- 8. Crypt ...和CP ...函數有什麼區別?
- 9. round()和trunc()函數有什麼區別?
- 10. setInformativeText和setText函數有什麼區別?
- 11. $ get和$ find函數有什麼區別?
- 12. NtFsControlFile()和DeviceIoControl()函數有什麼區別?
- 13. $!模型和!$模型在速度上有什麼區別嗎?
- 14. gcc的__sync和__atomic內在函數有什麼區別
- 15. 這兩種球拍功能在速度/效率方面有什麼區別?
- 16. 爲什麼方法執行速度慢?
- 17. 精度和刻度有什麼區別?
- 18. 長度和長度()有什麼區別?
- 19. JavaScript自執行函數 - 有什麼區別?
- 20. 提交和執行方法與ThreadPoolExecutor有什麼區別
- 21. 內容處理:「內聯」和「附件」之間有什麼區別?
- 22. bootstrap方法和run方法在角度上有什麼區別?
- 23. 函數和函數()在C#中有什麼區別?
- 24. 在javascript中var函數和函數有什麼區別?
- 25. 用URL和套接字下載的速度有什麼區別?
- 26. 靜態,內部和公共構造函數有什麼區別?
- 27. JAVA中的方法和函數有什麼區別?
- 28. Objective-C函數和Objective-C方法有什麼區別?
- 29. 函數完成執行後調用`done()`和調用`return`有什麼區別?
- 30. 這2個宏有什麼區別?
這是您不應該關心的過早優化。由於一系列原因,函數更安全。如果編譯器認爲這是一個好主意(通常人類內聯的選擇現在是錯誤的選擇(或者可能在函數保留後),也只能內聯函數)。編譯器的工作是快速編譯(當你嘗試過早地優化某些東西時,你只會阻礙編譯器的工作)。 – 2011-01-21 17:02:14
你能解釋什麼是過早的優化嗎? – Chandrakant 2011-01-21 17:09:12