Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `templat luaran` Boleh Menghalang Instantiasi Templat Berlebihan dalam C ?

Bagaimanakah `templat luaran` Boleh Menghalang Instantiasi Templat Berlebihan dalam C ?

Barbara Streisand
Lepaskan: 2024-12-20 20:42:09
asal
458 orang telah melayarinya

How Can `extern template` Prevent Redundant Template Instantiation in C  ?

Menggunakan templat luaran untuk Mengelakkan Sejurus Templat

Semerta templat ialah langkah penting dalam pengaturcaraan C, di mana tika templat khusus dibuat pada masa penyusunan . Dalam senario tertentu, adalah perlu untuk mengawal instantiasi templat untuk mengoptimumkan masa penyusunan dan mengelakkan definisi berlebihan. Di sinilah kata kunci templat luaran memainkan peranan.

Templat Luaran untuk Templat Fungsi

Apabila digunakan dengan templat fungsi, templat luaran mengarahkan pengkompil untuk tidak membuat instantiat yang ditentukan templat dalam unit terjemahan semasa. Ia menandakan bahawa instantiasi templat itu akan ditemui di tempat lain dalam program. Ini amat berguna dalam senario di mana berbilang fail sumber membuat contoh templat yang sama dengan parameter yang sama, yang membawa kepada berbilang takrifan yang mesti dibuang oleh pengkompil.

Contoh:

Pertimbangkan coretan kod berikut:

// header.h
template <typename T>
void f() { /* Body */}

// source1.cpp
#include "header.h"
void something1() { f<int>(); }

// source2.cpp
#include "header.h"
extern template void f<int>();
void something2() { f<int>(); }
Salin selepas log masuk

Dalam kes ini, templat luaran dalam source2.cpp memberitahu pengkompil bahawa f instantiasi templat harus diambil dari tempat lain. Ini menghalang pengkompil daripada menjana instantiasi berlebihan dan membuangnya kemudian semasa memaut.

Templat Luaran untuk Templat Kelas

Sama seperti templat fungsi, templat luaran juga boleh digunakan dengan templat kelas. Ini dilakukan untuk mengelakkan beberapa instantiasi kelas templat dengan parameter yang sama.

Contoh:

// header.h
template <typename T>
class MyClass { /* Body */}

// source1.cpp
#include "header.h"
MyClass<int> obj1;

// source2.cpp
#include "header.h"
extern template class MyClass<int>;
MyClass<int> obj2;
Salin selepas log masuk

Di sini, templat luaran dalam source2.cpp memastikan bahawa MyClass kelas templat digunakan sekali sahaja, menghalang takrifan berlebihan.

Garis Panduan untuk Menggunakan templat luaran

  • Gunakan templat luaran hanya apabila anda pasti bahawa instantiasi templat wujud di tempat lain dalam program.
  • Teknik ini boleh digunakan pada templat fungsi, templat kelas dan juga templat fungsi ahli.
  • Secara amnya dinasihatkan untuk menyimpan semua definisi templat dan instantiasi dalam satu fail pengepala untuk mengelakkan konflik yang berpotensi.
  • Jika tidak mungkin untuk memusatkan definisi templat, gunakan templat luaran dalam semua kecuali satu fail sumber tempat templat digunakan.

Atas ialah kandungan terperinci Bagaimanakah `templat luaran` Boleh Menghalang Instantiasi Templat Berlebihan dalam C ?. 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