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
Lepaskan: 2024-12-12 11:02:09
asal
202 orang telah melayarinya

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
}
Salin selepas log masuk
// source1.cpp
#include "header.h"
void something1() {
    ReallyBigFunction<int>();
}
Salin selepas log masuk
// source2.cpp
#include "header.h"
extern template void ReallyBigFunction<int>();
void something2() {
    ReallyBigFunction<int>();
}
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk

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>();
}
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk

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();
};
Salin selepas log masuk
// source1.cpp
#include "header.h"
Foo<int> foo1;
Salin selepas log masuk
// source2.cpp
#include "header.h"
extern template class Foo<int>;
Foo<int> foo2;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan