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

标签 c++ templates

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

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

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

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

最佳答案

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

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

关于c++ - 如何编译非类型模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760840/

相关文章:

c++ - 如何从指向多态基类的指针复制/创建派生类实例?

javascript - Zepto JS : CSS doesn't apply to basic HTML template

c++ - 理解通用引用的类型推导

c++ - 如何为具有相同模板的模板类定义和使用友元函数?

c++ - 如何为一系列整数值专门化 C++ 模板?

c++ - 获取当前日期/时间在 C++20 中是线程安全的吗?

c++ - 了解 range-v3 中的 zip 是如何工作的

c++ - Gnuplot C++ 从 txt 文件实时绘图

c++ - 如何在 C++ 中使用非虚拟接口(interface)成语实现接口(interface)类?

c++ - g++ 模板实例化器有多智能(避免模板膨胀)