Dari perbandingan yang berbeda antara templat C ++ dan C # / Java generics seperti ini-
Saya mendapat persepsi bahwa, template C ++ diimplementasikan oleh beberapa jenis preprocessing (penggantian teks biasa sebelum parsing), bukan kompilasi. Karena tipe yang memeriksa templat C ++ menyerupai makro C. Maksud saya, jika ada beberapa kesalahan, itu adalah kesalahan dari kode yang dihasilkan setelah memproses blok kode templated, bukan dari template itu sendiri. Dengan kata lain, mereka hanyalah sejenis makro versi atas di C.
Kemudian saya menemukan beberapa fakta lain yang mendukung ini-
Saya pikir, jika template C ++ diimplementasikan oleh preprocessing, akan ada masalah dengan tautan dinamis (menggunakan .dll). Dan googling cepat mendukung ini.
Poin lainnya adalah, konstanta integer dapat dikirimkan sebagai argumen ke template. Dan itu bahkan mendukung semacam rekursi. Tetapi rekursi ini tidak ditemukan dalam kode perakitan / mesin yang dikompilasi. Hal rekursi dikelola dalam waktu kompilasi dengan menghasilkan fungsi untuk setiap panggilan rekursif dan dengan demikian memiliki biner yang lebih besar tetapi lebih cepat dieksekusi.
Meskipun tidak seperti makro C, ia memiliki beberapa kemampuan superior. Tapi bukankah template C ++ diimplementasikan dengan semacam preprocessing? Bagaimana ini diimplementasikan dalam kompiler C ++ yang berbeda?
Jawaban:
Templat C ++ adalah semacam makro Lisp (atau bahkan lebih, Skema) yang bodoh. Ini adalah bahasa Turing-lengkap yang mengevaluasi dalam waktu kompilasi, tetapi sangat terbatas karena tidak ada akses dari bahasa itu ke lingkungan C ++ yang mendasarinya. Jadi, ya, templat C ++ dapat dilihat sebagai beberapa bentuk preprocessing, dengan interaksi yang sangat terbatas dengan kode yang dihasilkan.
sumber
Mungkin perbedaan terbesar adalah bahwa makro C diperluas pada fase preprocessing, sebelum kompilasi lain dilakukan, sementara template C ++ adalah bagian dari kompilasi. Ini berarti bahwa template C ++ adalah tipe-aware dan scoped, antara lain, dan bukan substitusi teks sederhana. Mereka dapat dikompilasi ke fungsi nyata, dan karena itu menghindari sebagian besar masalah yang dimiliki makro. Sadar-jenis berarti bahwa mereka dapat bersifat umum atau khusus: misalnya, mudah untuk menyediakan
swap
fungsi templat, dan mudah untuk menulis spesialisasi yang berfungsi dengan baik bahkan jika objek mengelola memori tumpukan.Oleh karena itu: templat C ++ tidak preprocessing dalam arti makro yang sama, mereka bukan semacam makro C, dan tidak mungkin untuk menggunakan makro C untuk menduplikasi apa yang dilakukan templat.
Template hidup dalam file header, bukan di perpustakaan yang ditautkan, benar, tetapi jika Anda memasok .dll Anda mungkin juga menyediakan file header untuk digunakan.
sumber
export
menerapkan. Saya tahu ini semacam berfungsi untuk fungsi, tapi saya ragu itu berfungsi untuk kelas: bagaimana Anda tahu ukurannya?Apakah penting penerapannya? Kompiler C ++ awal hanyalah pra-prosesor yang mengumpankan kode ke kompiler ac, itu tidak berarti C ++ hanyalah makro yang dimuliakan.
Template menghapus kebutuhan untuk makro dengan menyediakan cara yang lebih aman, lebih efisien dan dapat disesuaikan (bahkan saya pikir itu bukan kata sebenarnya) untuk mengimplementasikan kode untuk berbagai jenis.
Ada berbagai cara untuk melakukan templating kode jenis di c, tidak ada yang sangat bagus setelah Anda melampaui tipe sederhana.
sumber
Ada beberapa perbedaan; misalnya, templat dapat digunakan untuk instantiate fungsi yang berlebihan saat dibutuhkan, sementara dengan makro, Anda harus memperluas makro sekali untuk setiap kemungkinan kelebihan untuk membuatnya terlihat oleh kompiler, sehingga Anda akan berakhir dengan banyak kode yang tidak digunakan.
Perbedaan lainnya adalah bahwa templat menghormati ruang nama.
sumber
IMHO, C ++ templat dan C Macro dimaksudkan untuk menyelesaikan dua masalah yang sama sekali berbeda. Pustaka Template Standar C ++ asli adalah mekanisme untuk memisahkan secara rapi kelas kontainer (array, linked-list, dll.) Dari fungsi generik yang umum diterapkan pada mereka (seperti penyortiran dan penggabungan). Memiliki representasi abstrak dari algoritma dan struktur data yang efisien mengarah pada kode yang lebih ekspresif karena hanya ada sedikit dugaan bagaimana cara terbaik untuk mengimplementasikan fungsi yang bekerja pada bagian data tertentu. Makro C lebih sesuai dengan apa yang biasanya dilihat orang dalam Lisp macro, karena makalah itu menyediakan sarana untuk "memperluas" bahasa dengan kode yang digarisbawahi. Yang keren adalah bahwa C ++ Standard Library memperluas fungsionalitas templat untuk mencakup sebagian besar dari apa yang kita gunakan #define untuk dalam C.
sumber