C++11 模板元編程 - 不可變性


C++中可以參與編譯期計算的主要是類型和編譯期常量,它們都是不可變的(immutable)。從這個角度來說,C++模板元編程是一種純函數式語言,遵循引用透明性。也就是說函數沒有狀態,具有不可變性。對一個函數任何時候輸入相同的入參,它將永遠返回相同的值。另外,這里也沒有真正的變量。模板元編程里所謂變量只是一個類型的別名符號,第一次綁定后就不能再變。如果想要保存一個變化后的值,只能重新定義一個新的變量。

例如下面代碼就無法編譯通過:

using Sum = __int(0);  // ok
Sum = __add(Sum, __int(6)); // error

只能像下面這樣:

using Int0 = __int(0);  // ok
using Sum = __add(Int0, __int(6)); // ok

這種不可變性帶來很多好處。例如由于函數沒有狀態,所以可以保存入參然后延遲計算,這使得語言層面的惰性計算變得容易。

但這種不可變性也帶來很多問題,它會占用更多的內存和運行時開銷。純函數式語言一般依賴編譯器或者解釋器對其進行優化,但是性能普遍還是沒有命令式的好。這也是為什么大量地使用模板會使得C++的編譯速度超出尋常地慢,而且會占用更多的內存。


惰性

返回 C++11模板元編程 - 目錄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容