如何编译非类型模板参数
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中使用数字模板定义一个静态数组类。然后,每次声明一个具有唯一长度值的实例时,它都必须为它编译一个新的类定义。假设我的代码是开放式的,这可能会导致大量的编译定义。
据我所知,这仍然是鼓励实践。编译器是否有其他方法来处理非类型模板?或者以这种方式编译它的开销并不那么重要吗?
每个模板实例化在概念上是一个不同的实体。编译器可以为每个实例化创建不同的代码。模板参数是类型参数还是非类型参数并不重要。编译器可能能够在不同的实例化之间共享代码,并为相同的目标代码提供不同的符号,但肯定没有强制要求这样做(至少在代码链接之前,仍然需要为符号提供一些存储空间)。
因此,以一种最小化特定于模板参数的代码的方式构建实现是很重要的。例如,将多个实例化共用的代码分解到基类中可能是合理的(假设功能必须是成员函数)。对于剩余的代码,合理的做法是使其相当小,以便可以内联,并且如果它比调用函数和从函数返回所需的代码小,则不会产生任何开销。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 模板:重载时找不到基类类型参数方法