【发布时间】:2013-06-29 18:07:21
【问题描述】:
我尝试实现了C++14别名模板make_integer_sequence,它简化了类模板integer_sequence的创建。
template< class T, T... I> struct integer_sequence
{
typedef T value_type;
static constexpr size_t size() noexcept { return sizeof...(I) ; }
};
template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
要实现make_integer_sequence,我们需要一个辅助结构make_helper。
template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
实现make_helper 并不太难。
template< class T, T N, T... I >
struct make_helper
{
typedef typename mpl::if_< T(0) == N,
mpl::identity< integer_sequence<T,I...> >,
make_helper< T, N-1, N-1,I...>
>::type;
};
为了测试make_integer_sequence我做了这个主函数:
int main()
{
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n > BOOST_PP_CAT(int_seq,n) ;
BOOST_PP_REPEAT(256, GEN, ~);
}
我在具有 8GB 内存的四核 i5 系统上使用 GCC 4.8.0 编译了该程序。 成功编译耗时 4 秒。
但是,当我将 GEN 宏更改为:
int main() {
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n * 4 > BOOST_PP_CAT(int_seq, n) ;
BOOST_PP_REPEAT(256, GEN, ~ );
}
编译不成功,输出错误信息:
虚拟内存耗尽。
有人能解释一下这个错误吗?是什么原因造成的?
编辑:
我将测试简化为:
int main()
{
typedef make_integer_sequence< int, 4096 > int_seq4096;
}
然后我使用 GCC 4.8.0 -ftemplate-depth=65536 成功编译。
但是第二次测试:
int main()
{
typedef make_integer_sequence< int, 16384 > int_seq16384;
}
没有使用 GCC 4.8.0 -ftemplate-depth=65536 编译,导致错误:
虚拟内存耗尽。
那么,我的问题是,如何减少模板深度实例化?
问候, 胡尔希德。
【问题讨论】:
-
在 S.T.Lavavej 的一次谈话中,我想我听说微软编译器有一个钩子可以自动生成
make_integer_sequence,(基本上?)在 O(1) 中。具有讽刺意味的是,为了实现这一点,编译器可能会自己产生很多东西。