簡體   English   中英

模板中的第二階段編譯

[英]2nd phase compilation in templates

我試圖了解c ++模板Universe中的編譯過程和代碼生成過程。

我已經讀到,在編譯的第一階段,僅檢查了基本語法(在模板代碼中)。 並且僅針對完全完成編譯所使用的那些數據類型生成實際代碼,這稱為第二階段編譯。

  1. 我無法理解,編譯器如何知道可以為模板化的代碼調用哪種數據類型以及為其生成代碼(從而進行第二階段編譯)。 在某些情況下,某些情況下函數調用(在關閉函數模板的情況下)可能不那么精巧,無法在編譯時派生數據類型,只能在運行時根據用戶輸入來派生這些數據類型。

  2. 假設我使用具有很多條件的模板編寫了一個巨大的代碼,基於此條件它會生成模板化代碼的新實例(讓我們說一類的數據類型的新實例)。 我無法測試所有數據類型的代碼。 因此,這是否意味着如果我針對幾種數據類型進行測試,對於某些其他數據類型,我的代碼仍然有可能意外失敗嗎? 如果是這樣,我如何確保對所有數據類型強制進行第二次編譯(無論是否實例化基於我的輸入的數據類型)。

  1. 在編譯期間確定的類型僅取決於靜態信息。 與特定類型一起使用的功能模板將為該類型生成代碼,因為該選項需要在運行時中可用。 但是,如果可以靜態確定永遠不會發生函數調用,我認為編譯器可能會省略該實現,但在某些情況下仍然會強制執行該調用。

  2. 您不能測試所有數據類型,因為這是一個無限集。 您可以創建所有標准類型的集合,但是顯然您無法檢查所有用戶定義的類型。 通用代碼的思想是不依賴於您允許傳遞它的類型的細節。 或者,您可以關閉可能的實例集,以包括您批准的類型。

我不明白,編譯器如何知道可以針對哪種數據類型調用模板化代碼

編譯器知道其數據類型的模板代碼實際上所謂的,因為它看到了在模板代碼實際上是調用程序的每一個地方。 這里沒有魔術。 實例化發生在呼叫站點。 對於在實際現有調用中未使用的類型,不會進行實例化。

我的代碼仍然有可能失敗

對於所有基於測試的驗證,模板或沒有模板,甚至對於軟件以外的其他事物,都是如此。 您無法通過測試涵蓋所有可能的用例。 這是生活的基本事實。 處理...以某種方式。

暫無
暫無

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

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