簡體   English   中英

現在是否可以生成非內聯的 C++ 模板函數?

[英]Is it possible to generate C++ template functions that are not inline these days?

過去,模板化函數並不總是內聯的。 在 .cpp 文件中定義模板函數有很多問題,因為它不知道不同的模塊作為模板參數傳入了什么。 所以模板幾乎總是純頭文件,包括所有內容。

但是,代碼可能非常大,所以如果我想創建一個模板類,例如 Matrix 並將方法實際生成為函數,有什么辦法可以做到嗎?

這曾經有效:

template<typename Precision>
Matrix<Precision> operator *(const Matrix<Precision>& a, const Matrix<Precision>& b) {

}

然后確保為所需類型生成所有方法:

Matrix<float>;
Matrix<double>;
Matrix<long double>;
Matrix<int>;

g++ 現在在類型規范上給出錯誤(它什么都不做)並且函數是內聯生成的,所以它是不可調用的。

有沒有辦法在 C++20 中做到這一點? 模塊能解決這個問題嗎?

問題與運算符是否為inline正交,模板的定義(主體)必須在實例化點可用。

您已經顯式實例化了Matrix類,但問題是您的operator *是一個自由運算符,因此它獨立於Matrix並且需要單獨實例化。

.h 文件:

// template declaration
template <typename Precision>
Matrix<Precision> operator*(Matrix<Precision> const& a, Matrix<Precision> const& b);

// explicit instantiation declaration
extern template Matrix<float> operator*(Matrix<float> const&, Matrix<float> const&);
extern template Matrix<double> operator*(Matrix<double> const&, Matrix<double> const&);

.cpp 文件:

// template definition
template <typename Precision>
Matrix<Precision> operator*(Matrix<Precision> const& a, Matrix<Precision> const& b) {
  // . . .
}

// explicit instantiation
template Matrix<float> operator*(Matrix<float> const&, Matrix<float> const&);
template Matrix<double> operator*(Matrix<double> const&, Matrix<double> const&);

所有這些的缺點是這里沒有任何東西會被內聯(除非您使用 LTO),這會損害運行時性能。 因此,很少使用顯式模板實例化。

模塊不能解決這個問題,但它們可以通過只解析一次頭文件並以二進制形式存儲中間表示來加快常規構建時間。

暫無
暫無

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

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