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

塔欣

我对类型模板参数的编译方式有很好的了解。但是非类型模板是否以相同的方式进行编译?

例如,使用这样的类型模板:

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..
};

如果是这样,如果template参数存在大量的数字可能性,那么这是否会导致大量compiled肿的编译代码?我可以在核心API中使用数字模板定义一个静态数组类。然后,每次我声明具有唯一长度值的实例时,都必须为其编译一个新的类定义。假设我的代码是开放式的,这可能导致大量的已编译定义。

据我所知,这仍然是鼓励做法。编译器还有其他处理非类型模板的方法吗?还是以这种方式进行编译而产生的开销不是那么重要吗?

迪特玛·库尔(DietmarKühl)

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章