Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `templat luaran` dalam C 11 Boleh Menghalang Instantiasi Templat Pendua dan Mengurangkan Masa Penyusunan?
templat luaran ialah kata kunci C 11 yang berkuasa yang membolehkan pembangun menghalang instantiasi templat dalam unit kompilasi tertentu . Ini amat berguna apabila bekerja dengan pangkalan kod yang besar di mana berbilang fail sumber boleh membuat contoh templat yang sama dengan parameter yang berbeza, yang membawa kepada kod pendua dan peningkatan masa penyusunan.
Dalam kes templat fungsi, templat luaran boleh digunakan untuk memaksa pengkompil supaya tidak membuat instantiate templat tertentu apabila ia mengetahui bahawa fungsi itu akan dijadikan instantiated di tempat lain. Pertimbangkan contoh berikut:
// header.h template<typename T> void ReallyBigFunction() { // Body }
// source1.cpp #include "header.h" void something1() { ReallyBigFunction<int>(); }
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
Tanpa templat luaran, pengkompil akan menyusun ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
Memautkan fail ini bersama-sama akan menghasilkan satu salinan ReallyBigFunction
Untuk mengelakkan isu ini, kita boleh menggunakan templat luaran dalam source2.cpp:
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
Ini akan menghasilkan fail objek berikut:
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
Apabila fail objek ini dipautkan, fail objek kedua akan menggunakan simbol daripada fail objek pertama, mengelakkan kod pendua dan mengurangkan masa penyusunan.
templat luaran juga boleh digunakan dengan templat kelas untuk menghalang instantiasi ahli kelas tertentu. Contohnya:
// header.h template<typename T> class Foo { public: T f(); };
// source1.cpp #include "header.h" Foo<int> foo1;
// source2.cpp #include "header.h" extern template class Foo<int>; Foo<int> foo2;
Tanpa templat luaran, pengkompil akan menyusun fungsi ahli f untuk Foo
templat luaran ialah alat yang berharga untuk mengelakkan kod pendua dan mengurangkan masa penyusunan dalam projek C 11. Dengan menggunakan templat luaran secara terpilih untuk mengelakkan instantiasi templat yang tidak diperlukan, pembangun boleh mengoptimumkan prestasi kod mereka.
Atas ialah kandungan terperinci Bagaimanakah `templat luaran` dalam C 11 Boleh Menghalang Instantiasi Templat Pendua dan Mengurangkan Masa Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!