Bagikan melalui


Membandingkan unit header, modul, dan header yang dikompilasi sebelumnya

Secara historis, Anda akan menyertakan pustaka standar dengan direktif seperti #include <vector>. Namun, mahal untuk menyertakan file header karena diolah ulang oleh setiap file sumber yang menyertakannya.

Header yang telah dikompilasi sebelumnya (PCH) diperkenalkan untuk kompilasi kecepatan dengan menerjemahkannya sekali dan menggunakan kembali hasilnya. Tetapi header yang telah dikompresi bisa sulit dipertahankan.

Di C++20, modul diperkenalkan sebagai peningkatan signifikan pada file header dan header yang telah dikompretasi.

Unit header diperkenalkan di C++20 sebagai cara untuk menjenjang sementara kesenjangan antara file header dan modul. Modul ini memberikan beberapa manfaat kecepatan dan ketahanan modul, sementara Anda memigrasikan kode Anda untuk menggunakan modul.

Kemudian, pustaka standar C++23 memperkenalkan dukungan untuk mengimpor pustaka standar sebagai modul bernama. Ini adalah cara tercepat dan paling kuat untuk mengonsumsi pustaka standar.

Untuk membantu Anda memilah opsi yang berbeda, artikel ini membandingkan metode tradisional #include dengan header, unit header, dan impor modul bernama yang telah dikompilasi sebelumnya.

Tabel berikut diatur oleh kecepatan pemrosesan dan ketahanan pengompilasi, dengan #include menjadi yang paling lambat dan paling tidak kuat, dan import menjadi yang tercepat dan paling kuat.

Metode Ringkasan
#include Salah satu kerugiannya adalah mereka mengekspos makro dan implementasi internal. Implementasi internal sering diekspos sebagai fungsi dan jenis yang dimulai dengan garis bawah. Itu adalah konvensi untuk menunjukkan bahwa sesuatu adalah bagian dari implementasi internal dan tidak boleh digunakan.

File header rapuh karena urutan #includes dapat mengubah perilaku atau memecahkan kode dan dipengaruhi oleh definisi makro.

Kompilasi lambat file header. Terutama ketika beberapa file menyertakan file yang sama karena file header diolah ulang beberapa kali.
Header yang telah dikompresi Header yang telah dikompilasi sebelumnya (PCH) meningkatkan waktu kompilasi dengan membuat rekam jepret memori kompilator dari sekumpulan file header. Ini adalah peningkatan pada berulang kali membangun ulang file header.

File PCH memiliki batasan yang membuatnya sulit dipertahankan.

File PCH lebih cepat daripada #include tetapi lebih lambat dari import.
Unit header Ini adalah fitur baru di C++20 yang memungkinkan Anda mengimpor file header 'bertingkah baik' sebagai modul.

Unit header lebih cepat daripada #include, dan lebih mudah dipertahankan, secara signifikan lebih kecil, dan juga lebih cepat daripada file header yang telah dikompilasi sebelumnya (PCH).

Unit header adalah langkah 'di antara' yang dimaksudkan untuk membantu transisi ke modul bernama dalam kasus di mana Anda mengandalkan makro yang ditentukan dalam file header, karena modul bernama tidak mengekspos makro.

Unit header lebih lambat daripada mengimpor modul bernama.

Unit header tidak terpengaruh oleh makro yang ditentukan kecuali ditentukan pada baris perintah saat unit header dibuat--membuatnya lebih kuat daripada file header.

Unit header mengekspos makro dan implementasi internal yang didefinisikan di dalamnya sama seperti yang dilakukan file header, yang bernama modul tidak.

Sebagai perkiraan kasar dari ukuran file, file PCH 250 megabyte mungkin diwakili oleh file unit header 80 megabyte.
Modul Ini adalah cara tercepat dan paling kuat untuk mengimpor fungsionalitas.

Dukungan untuk mengimpor modul diperkenalkan di C++20. Pustaka standar C++23 memperkenalkan dua modul bernama yang dijelaskan dalam topik ini.

Saat mengimpor std, Anda mendapatkan nama standar seperti std::vector, , std::couttetapi tidak ada ekstensi, tidak ada pembantu internal seperti _Sort_unchecked, dan tanpa makro.

Urutan impor tidak masalah karena tidak ada makro atau efek samping lainnya.

Sebagai perkiraan kasar dari ukuran file, file PCH 250 megabyte mungkin diwakili oleh file unit header 80 megabyte, yang mungkin diwakili oleh modul 25 megabyte.

Modul bernama lebih cepat karena ketika modul bernama dikompilasi ke dalam .ifc file dan .obj file, pengkompilasi memancarkan representasi terstruktur dari kode sumber yang dapat dimuat dengan cepat saat modul diimpor. Pengkompilasi dapat melakukan beberapa pekerjaan (seperti resolusi nama) sebelum memancarkan .ifc file karena bagaimana modul bernama independen pesanan dan makro-independen--sehingga pekerjaan ini tidak harus dilakukan ketika modul diimpor. Sebaliknya, ketika file header dikonsumsi dengan #include, kontennya harus diprosces dan dikompilasi lagi dan lagi di setiap unit terjemahan.

Header yang telah dikompilasi sebelumnya, yang merupakan rekam jepret memori kompilator, dapat mengurangi biaya tersebut, tetapi tidak serta modul bernama.

Jika Anda dapat menggunakan fitur C++20 dan pustaka standar C++23 di aplikasi Anda, gunakan modul bernama.

Jika Anda dapat menggunakan fitur C++20 tetapi ingin beralih dari waktu ke waktu ke modul, gunakan unit header di sementara.

Jika Anda tidak dapat menggunakan fitur C++20, gunakan #include dan pertimbangkan header yang telah dikompreilasi.

Lihat juga

File header yang telah dikompresi
Gambaran umum modul di C++
Tutorial: Mengimpor pustaka standar C++ menggunakan modul
Panduan: Mengimpor pustaka STL sebagai unit header
Panduan: Membangun dan mengimpor unit header di proyek Visual C++ Anda