[英]Where are template parameters stored in c++?
假設我們有一個 A 類:
template<int N>
class A final{
public:
void foo() const { cout << N << endl; }
};
模板參數 N 存儲在哪里? 在堆中還是在堆棧中的對象內存中?
N
本身不存儲在任何地方,它被編碼到類型中。 從這個角度來看,模板特化A<1>
與非模板類A1
。 對於A<2020>{}.foo()
您可能會獲得與std::cout << 2020
相同的程序集。 當然,常量2020
必須存儲在某處,但它不會是A<2020>{}
對象的一部分。
編譯后,根據目標架構, A<2020>{}.foo()
可能如下所示 (x86-64):
mov esi, 2020
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
這里N
直接放入寄存器。
或(ARM):
ldr r1, .L4
ldr r0, .L4+4
bl std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
...
.L4:
.word 2020
.word _ZSt4cout
這里N
是從某個內存位置加載的。
通常,使用模板的好處是模板本身不消耗任何運行時性能,並且在運行時也不消耗內存空間。 它們甚至在運行時都不存在了,因為它們已經在編譯時被完全處理和評估過。
因此,模板本身成本性能和空間的唯一時間是在編譯時。
但是,模板在編譯時生成的代碼當然會在運行時占用空間。 如果模板被多次實例化,那么代碼也會被多次生成,對於程序使用的每組模板參數都會生成一次。 代碼大小的增加也會對性能產生負面影響,因為 CPU 指令緩存可以比大量代碼更好地緩存少量代碼。
回答你的問題:
在運行時,模板本身及其參數既不存儲在堆中也不存儲在堆棧中,因為它們甚至不再存在。 只有在編譯時,模板及其參數才會存儲在編譯器的堆或堆棧中的某處。 但是,您對編譯器的內部結構不感興趣(除非您計划編寫自己的編譯器)。
但是,在您的示例中,您問題中 N 的值仍將存儲在您的程序中的某個位置。 但它不會作為模板參數存儲,而是作為在編譯時評估模板的結果存儲在程序的可執行代碼中的立即值。 它實際上有時也可能存儲在您的程序堆棧中,因為在您的示例中,它作為函數調用的參數傳遞。 但是,函數參數是通過堆棧還是通過 CPU 寄存器傳遞取決於您使用的平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.