2011-01-21 50 views
4

編譯器如何處理宏內聯函數以減少執行時間?宏和內聯函數在執行速度方面有什麼區別?

+3

這是您不應該關心的過早優化。由於一系列原因,函數更安全。如果編譯器認爲這是一個好主意(通常人類內聯的選擇現在是錯誤的選擇(或者可能在函數保留後),也只能內聯函數)。編譯器的工作是快速編譯(當你嘗試過早地優化某些東西時,你只會阻礙編譯器的工作)。 – 2011-01-21 17:02:14

+0

你能解釋什麼是過早的優化嗎? – Chandrakant 2011-01-21 17:09:12

回答

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. 內聯函數由編譯器解析| 1.宏由預處理器處理。
  2. 內聯函數可以寫在裏面| 2.宏不能寫入裏面。 這個班。 |
  3. inline執行strick類型檢查| 3.宏不執行嚴格的檢查。
  4. 內聯函數按關鍵字進行。 | 4.宏在哪裏進行#include | ,定義。
  5. 包含參數的內聯函數是| 5.包含表達式的宏必須被 處理過一次,然後可以使用許多|每次使用時都要進行處理。 時間。 |
1

此外,MACROS無法訪問類成員變量。它不瞭解範圍。在這裏,內聯函數會很有用。

0

內聯函數遵循所有在正常函數上執行的類型安全協議。

內聯函數使用與任何其他函數相同的語法來指定,除了它們在函數聲明中包含內聯關鍵字。

作爲參數傳遞給內聯函數的表達式被評估一次。在某些情況下,作爲參數傳遞給宏的表達式可以被多次計算。

要記住的另一件事是宏在預編譯時擴展,所以你不能使用它們進行調試。但是,對於內聯函數,情況並非如此。

範圍在宏的情況下是全局的,局部範圍可以應用於內聯函數。

0

內聯函數遠比宏更好。例如,如果內聯函數的大小足以減慢代碼的執行速度,那麼編譯器不會將它內聯到宏,因爲在宏上沒有這種檢查

相關問題