Baiklah, mari kita hancurkan beberapa asumsi Anda:
- Salah satu keuntungan dari perpustakaan header-only untuk C ++ adalah bahwa mereka tidak perlu dikompilasi secara terpisah.
Mengompilasi sesuatu secara terpisah berarti berpotensi tidak harus mengkompilasi ulang semuanya jika hanya sebagian yang berubah.
Jadi, kerugian bukannya keuntungan.
- Dalam C dan C ++ sebaris masuk akal hanya jika fungsi didefinisikan dalam file header *.
Ya, satu-satunya efek yang inline
tersisa adalah pengecualian pada aturan satu definisi .
Celakalah kamu, jika definisi itu berbeda dalam cara apa pun.
Jadi, jika fungsi internal ke unit kompilasi, tandai static
. Itu juga membuat inlining lebih mungkin, karena fungsi harus tersedia untuk menyelaraskannya.
Namun, lihat optimasi tautan-waktu, yang didukung oleh setidaknya MSVC ++, gcc, dan dentang.
- Secara tradisional, dalam tata letak C, .c / .h telah digunakan, di mana tajuk mewakili antarmuka publik minimal dari unit terjemahan. Demikian pula, .cpp / hpp.
Ya, hanya menghadirkan antarmuka minimal yang merupakan salah satu tujuan, untuk mencapai stabilitas API dan ABI yang lebih tinggi, dan untuk meminimalkan waktu kompilasi.
Khususnya kelas C ++ tidak benar-benar diarahkan untuk itu, karena semua bit pribadi bocor ke header, seperti halnya yang dilindungi apakah Anda ingin mendapatkan dari itu atau tidak.
PIMPL desain-pola adalah untuk mengurangi detail tersebut.
Bagian di mana memisahkan antarmuka dan implementasi sepenuhnya gagal di C ++ adalah templat.
Panitia mencoba melakukan sesuatu dengan templat yang diekspor , tetapi yang telah ditinggalkan terlalu rumit dan tidak benar-benar berfungsi.
Sekarang, mereka bekerja pada sistem modul yang tepat , meskipun lambat. Itu sangat mengurangi waktu kompilasi, dan juga harus meningkatkan stabilitas API dan ABI dengan mengurangi permukaannya.
Apakah perpustakaan hanya header umumnya lebih efisien kode-dan waktu pelaksanaan bijaksana daripada tata letak tradisional? Jika demikian, apakah ini karena inlining ekstensif atau optimasi lainnya?
Pustaka khusus header dapat lebih efisien dalam ukuran kode dan waktu eksekusi, meskipun itu tergantung pada apakah pustaka dibagi, berapa banyak yang digunakan, dengan cara apa, dan apakah inlining membuktikan kemenangan yang menentukan dalam kasus tertentu.
Dan alasan inlining sangat penting untuk optimasi bukan karena inlining itu sendiri adalah dorongan yang besar, tetapi karena peluang untuk propagasi konstan dan optimasi lebih lanjut terbuka.