簡體   English   中英

C ++編譯器如何處理模板

[英]C++ How do compilers handle templates

正如你們中的一些人可能從我最近的帖子中知道的那樣,我正在學習C ++考試,該課程的內容非常糟糕。 我基本上不得不自己教一切,所以在這里忍受我。

這是一個考試題目:

(i)解釋C ++語言中定義的模板的概念。 一定要區分程序員做什么和編譯器做什么。

我目前的理由:

(i)模板允許函數或類使用泛型操作。 這允許程序員有效地編程X功能一次,並且能夠將該功能與許多不同的數據類型一起使用,而無需多次重寫應用程序或應用程序的某些部分。

我的問題是我不知道編譯器如何處理模板的使用。

我不確定編譯器在這個階段做了什么,如果有人能夠清除它會有所幫助。

假設您使用模板編寫函數:

template <typename T>
void function(T t){
 doSomething();
}

對於你調用這個函數的每個數據類型,編譯器只需用該數據類型替換'T',比如'int'並生成代碼,就像你從頭開始用'int'而不是'T'編寫這個函數一樣。 如果其他人同意,這可能是正確的(但不是完整的)答案。

C ++中的模板是通過替換實現的。 它不像Java泛型,只需鍵入檢查涉及泛型類的代碼,然后使用原始引用(類型擦除)編譯它。

基本上,C ++為代碼中使用的每個實際模板參數創建不同的類/方法。 如果你有你的

template<typename T>
void myMethod(T t)
{
  //
}

在編譯時發生的事情是為實際使用模板的每種類型編譯不同的方法。 如果您在myMethod(50)myMethod("foo")上使用它,那么該方法的兩個重載版本將在運行時可用。 直觀地說,這意味着模板可以生成代碼膨脹,但實際上,相同的表現力是通過更大的代碼庫獲得的,沒有可讀性較低的模板,因此這不是真正的問題。

所以他們背后沒有黑魔法(如果你考慮元編程或部分專業化,那就好吧)。

對於您創建的不同類型的對象的每個實例,或者在函數的情況下使用您使用的不同類型的參數,編譯器只是在編譯時生成重載版本。 因此,如果你有像sort函數這樣的模板函數並將該函數用於int和double數組,那么編譯器實際上已經創建了兩個函數:一個使用int而另一個使用double。 這是我能給出的最簡單的解釋。 希望它有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM