Saya menggunakan Visual Studio 2012 dan dia memiliki kasus di mana kami menambahkan parameter template ke kelas "hanya" untuk memperkenalkan "titik jahitan" sehingga dalam unit-test kita dapat mengganti bagian-bagian itu dengan benda tiruan.
Bagaimana Anda biasanya memperkenalkan titik jahitan di C ++: menggunakan antarmuka dan / atau pencampuran berdasarkan beberapa kriteria dengan antarmuka implisit dengan menggunakan parameter templat juga? Salah satu alasan untuk menanyakan hal ini juga karena ketika mengkompilasi kadang-kadang satu file C ++ (yang termasuk file templat, yang juga bisa menyertakan templat lain) menghasilkan file objek yang dihasilkan dalam waktu sekitar 5-10 detik pada mesin pengembang .
VS compiler juga tidak terlalu cepat mengkompilasi template sejauh yang saya mengerti, dan karena model inklusi template (Anda praktis memasukkan definisi template di setiap file yang menggunakannya secara tidak langsung dan mungkin instantiate ulang template itu setiap kali Anda memodifikasi sesuatu yang tidak ada hubungannya dengan template itu) Anda bisa memiliki masalah dengan waktu kompilasi (ketika melakukan kompilasi tambahan).
Apa cara Anda menangani waktu kompilasi bertahap (dan tidak hanya) ketika bekerja dengan templat (selain kompiler yang lebih baik / lebih cepat :-)).
Jawaban:
Jika parameter template Anda hanya dapat mengasumsikan seperangkat nilai yang terbatas (dan kecil), Anda bisa memindahkan definisinya dalam file sumber, dan menggunakan instantiasi eksplisit .
Misalnya,
aaa.h
Anda hanya mendeklarasikan fungsi templatf
dang
:Asumsikan
n
parameter templat hanya boleh 1, 3, 6, danT
parameter templat hanya bisaint
,long
danvoid *
.Kemudian Anda mendefinisikannya
aaa.cpp
seperti ini:Dengan cara ini kompiler instantiates templat untuk parameter yang diberikan saat kompilasi
aaa.cpp
. Ketika mengkompilasi kode klien, itu mengasumsikan bahwa definisi ada di suatu tempat, dan penghubung akan mengurusnya.Anda juga dapat secara eksplisit instantiate kelas template. Kekurangannya adalah Anda tidak dapat menggunakan
f
ataug
dengan parameter template lainnya.hasil dalam
Saya menggunakan teknik ini dalam proyek di mana beberapa kelas kompleks bergantung pada set kecil (<10) parameter template integer, dan secara signifikan mengurangi waktu kompilasi (karena kompiler tidak harus menguraikan definisi template kompleks ketika mengkompilasi kode klien) . Tentu saja Anda mungkin mendapatkan peningkatan yang lebih rendah, tergantung pada kode yang sebenarnya.
sumber
Setelah saya menggunakan solusi aneh untuk masalah yang sama: Termasuk STL memimpin untuk mengkompilasi waktu seperti beberapa detik per file sumber - tidak peduli seberapa kecil itu. Jadi saya memasukkan semua file sumber saya ke dalam satu file master dan waktu kompilasi per file hampir tidak berubah ... yang berarti mempercepat faktor 20+ karena saya hanya memiliki satu file untuk dikompilasi.
Untuk menjaga desain tetap bersih, saya terus mempertahankan makefile, tetapi tidak pernah benar-benar menggunakannya (kecuali untuk memverifikasi masih berfungsi).
sumber
Kami biasa menjalankan tugas besar untuk membangun tajuk yang sudah dikompilasi dan templat yang telah dikompilasi dalam semalam, dan hanya membangun terhadap yang berikutnya.
sumber