【发布时间】:2018-06-06 22:12:48
【问题描述】:
我最近开始使用 C++ 进行模板元编程,并一直在尝试将一些基本函数转换为它们各自的递归编译时模板定义。
例如:
template <typename T, T A, unsigned int N>
class pow { enum : T { value = A * pow<T, A, N-1>::value } };
template <typename T, T A> class pow<T, A, 0> { enum : T { value = 1 } };
模板的语法和功能令我惊叹。然而,一个问题困扰着我: C++ 如何处理这些递归定义? (资源方面)
或者更具体地说:
编译器如何处理包含枚举值的模板类的实例创建(内存分配的位置/方式)?
编译后生成的所有类是否都保留在内存中,还是由编译器优化出来,只保留顶级类(清理)?
是否存在独立于 RAM 的最大递归深度(编译器本身的限制)?
非常感谢您对此类结构的标准编译进行深入解释。
【问题讨论】:
-
“是否存在最大递归深度...”:g++ 有
-ftemplate-depth=n参见:gcc.gnu.org/onlinedocs/gcc/… -
那么现在是 1024。但它是编译器约束还是只是一个约定(因为 17 对于以前的 C++ 标准来说是一个奇怪的选择)?
-
我无法想象编译器会转储实例化类型,毕竟它无法知道它是否会在将来的某个时间再次使用。只有在链接阶段才会执行某种剔除。通过元编程,我希望剔除是完整的。
标签: c++ memory-management metaprogramming compiler-optimization compile-time