繁体   English   中英

如何编译非类型模板参数?

[英]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中使用数字模板定义静态数组类。 然后每次我声明一个具有唯一长度值的实例时,它必须为它编译一个新的类定义。 假设我的代码是开放式的,这可能导致大量编译定义。

据我所知,这仍然是鼓励练习。 那么编译器是否还有其他一些处理非类型模板的方法? 或者以这种方式编译的开销并不是那么重要?

每个模板实例化在概念上都是不同的实体。 编译器可以为每个实例化创建不同的代码。 模板参数是类型参数还是非类型参数无关紧要。 编译器可能能够在不同的实例化之间共享代码并为同一目标代码提供不同的符号,但肯定没有这样做的任务(至少在代码链接之前,符号仍然需要一些存储空间)。

因此,以最小化特定于模板参数的代码的方式构造实现是很重要的。 例如,将多个实例化共同的代码分解为基类(假设功能必须是成员函数)可能是合理的。 对于剩下的代码,使其相当小是合理的,这样它可以内联,如果它小于调用函数并从它们返回所需的代码,则不会产生任何开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM