Pelaksanaan C 14 make_integer_sequence dan Analisis Ralat
Pengenalan
Templat alias C 14 make_integer_sequence memudahkan penciptaan templat kelas integer_sequence. Artikel ini membincangkan pelaksanaan menggunakan struktur pembantu dan makro serta meneroka ralat yang dihadapi semasa penyusunan.
Pelaksanaan make_integer_sequence
Untuk melaksanakan make_integer_sequence, struktur pembantu make_helper ditakrifkan:
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; };
Pelaksanaan sebenar make_integer_sequence kemudiannya menjadi:
template< class T , class N > using make_integer_sequence = typename make_helper<T,N>::type;
Analisis Ralat
Kompilasi dengan GCC 4.8.0 pada mulanya gagal disebabkan oleh kehabisan memori maya. Ralat ini berlaku apabila GEN makro diubah suai untuk menjana jujukan yang lebih besar. Sebab untuk ini ialah pelaksanaan memerlukan instantiasi templat yang mendalam, yang boleh menghabiskan memori yang tersedia.
Penurunan Instantiasi Kedalaman Templat
Untuk mengurangkan instantiasi templat dalam, sama ada Pilihan pengkompil -ftemplate-depth boleh digunakan untuk meningkatkan kedalaman maksimum atau pelaksanaan yang berbeza dengan kerumitan logaritma boleh digunakan.
Pelaksanaan Log N
Pelaksanaan log N yang disediakan menggunakan pendekatan rekursif dan lebih cekap:
template<unsigned...> struct seq{ using type = seq; }; template<class S1, class S2> struct concat; template<unsigned... I1, unsigned... I2> struct concat<seq<I1...>, seq<I2...>> : seq<I1..., (sizeof...(I1)+I2)...>{}; template<class S1, class S2> using Concat = Invoke<concat<S1, S2>>; template<unsigned N> struct gen_seq; template<unsigned N> using GenSeq = Invoke<gen_seq<N>>; template<unsigned N> struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{}; template<> struct gen_seq<0> : seq<>{}; template<> struct gen_seq<1> : seq<0>{};
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan `make_integer_sequence` C 14 dengan Cekap dan Mengelakkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!