簡體   English   中英

如何編譯非類型模板參數?

[英]How do non-type template parameters get compiled?

我對如何編譯類型模板參數有一個公平的理解。 但是非類型模板是否以相同的方式編譯?

例如,使用類似這樣的類型模板:

template<typename T>
class TemplatedClass {
    ..do something with T..
};
TemplatedClass<int> IntClass;
TemplatedClass<char> CharClass;

以上內容將被編譯為單獨的int和char類定義:

class TemplatedClass<int> {
    ..do something with int..
};
class TemplatedClass<char> {
    ..do something with char..
};

模板化非類型參數時,編譯器是否以相同的方式執行此操作? 例如:

template<int N>
class NumericClass {
    int array[N];
    ..do something else with N..
};
NumericClass<3> Class3;
NumericClass<5> Class5;

這會為每個數值生成單獨的類定義,如下所示?

class NumericClass3 {
    int array[3];
    ..do something else with 3..
};
class NumericClass5 {
    int array[5];
    ..do something else with 5..
};

如果是這樣的話,如果模板參數存在大量的數字可能性,那么是否會導致大量繁瑣的編譯代碼? 我可以在我的核心API中使用數字模板定義靜態數組類。 然后每次我聲明一個具有唯一長度值的實例時,它必須為它編譯一個新的類定義。 假設我的代碼是開放式的,這可能導致大量編譯定義。

據我所知,這仍然是鼓勵練習。 那么編譯器是否還有其他一些處理非類型模板的方法? 或者以這種方式編譯的開銷並不是那么重要?

每個模板實例化在概念上都是不同的實體。 編譯器可以為每個實例化創建不同的代碼。 模板參數是類型參數還是非類型參數無關緊要。 編譯器可能能夠在不同的實例化之間共享代碼並為同一目標代碼提供不同的符號,但肯定沒有這樣做的任務(至少在代碼鏈接之前,符號仍然需要一些存儲空間)。

因此,以最小化特定於模板參數的代碼的方式構造實現是很重要的。 例如,將多個實例化共同的代碼分解為基類(假設功能必須是成員函數)可能是合理的。 對於剩下的代碼,使其相當小是合理的,這樣它可以內聯,如果它小於調用函數並從它們返回所需的代碼,則不會產生任何開銷。

暫無
暫無

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

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