不那么新的modern C++简要学习笔记 logo 不那么新的modern C++简要学习笔记

编译器支持最低版本要求:

  • GCC: 3.3
  • MSVC: 12.0
  • Clang: Yes

提案: N1987

C++11引入了一个新特性——extern template。这个特性可以用于显式实例化一个模板,然后在另一个编译单元中使用它,以避免在每个编译单元中都生成一个新的实例。

在C++中,模板通常在头文件中定义。当头文件被包含到多个编译单元中时,每个编译单元都会生成一个新的模板实例。这会导致编译时间增加,并且可能会导致代码大小变大。

extern template可以避免这个问题。它的语法形式为:

extern template class template-name<template-arguments>;

这里,template-name是模板的名称,template-arguments是模板参数。通过使用extern template,我们可以显式地实例化一个模板,并告诉编译器在另一个编译单元中使用它。例如:

// 在A.cpp中显式实例化一个模板
template class std::vector<int>;

// 在B.cpp中使用该模板
void foo() {
    std::vector<int> v; // 不会在B.cpp中生成新的实例
    // ...
}

这里,在A.cpp中显式实例化了一个std::vector<int>模板,并告诉编译器在另一个编译单元中使用它。在B.cpp中使用该模板时,不会生成新的实例,而是使用在A.cpp中已经实例化的版本。

需要注意的是,使用extern template并不会完全替代模板的头文件定义。如果一个模板被多个编译单元使用,并且它的实现依赖于某些特定的编译器选项,那么仍然需要在头文件中定义模板。此外,extern template只能用于类模板,不能用于函数模板。

感觉不错,小额赞助一下!
missdeer WeChat Pay

微信扫一扫

missdeer AliPay

支付宝扫一扫

Hosted by Netlify, 本站由 @missdeer 创建,由 Jekyll 于 2024-03-12 生成,感谢 CloudCannon 制作的theme: Edition ,感谢 Let's Encrypt 提供免费的SSL证书服务。本站点采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。© 2017 - 2024