Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `templat luaran` dalam C 11 Boleh Menghalang Instantiasi Templat Pendua dan Mengurangkan Masa Penyusunan?

Bagaimanakah `templat luaran` dalam C 11 Boleh Menghalang Instantiasi Templat Pendua dan Mengurangkan Masa Penyusunan?

Patricia Arquette
Patricia Arquetteasal
2024-12-12 11:02:09196semak imbas

How Can `extern template` in C  11 Prevent Duplicate Template Instantiations and Reduce Compilation Time?

Menggunakan templat luaran untuk Mengelakkan Semerta dalam C 11

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.

Templat Fungsi

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 dalam kedua-dua source1.cpp dan source2.cpp, menghasilkan fail objek berikut:

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 dibuang, membuang masa penyusunan dan saiz fail objek.

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 Kelas

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 dalam kedua-dua source1.cpp dan source2.cpp, menghasilkan kod pendua. Menggunakan templat luaran memastikan fungsi ahli disusun sekali sahaja.

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn