Saya telah diperkenalkan ke Ilmu Komputer selama kurang lebih satu tahun sekarang, dan dari pengalaman saya tampaknya C dan C ++ keduanya dianggap sebagai bahasa "ultra cepat", sedangkan yang lain seperti Python dan bahasa skrip semacam itu biasanya dianggap agak lambat .
Tetapi saya juga telah melihat banyak kasus di mana proyek perangkat lunak atau bahkan yang kecil akan interleave file di mana sejumlah n file tersebut akan ditulis dalam C, dan sejumlah m dari file-file tersebut akan ditulis dalam C ++.
(Saya juga memperhatikan bahwa file C ++ hampir selalu memiliki header yang sesuai, sedangkan file C tidak begitu banyak). Tapi pertanyaan utama saya adalah untuk mendapatkan intuisi umum tentang kapan tepat menggunakan C lebih dari C ++, dan ketika lebih baik menggunakan C ++ lebih dari C. Selain fakta bahwa (1) C ++ berorientasi objek sedangkan C tidak, dan (2) sintaksisnya sangat mirip, dan C ++ sengaja dibuat menyerupai C dalam banyak hal, saya tidak yakin apa perbedaannya. Tampaknya bagi saya bahwa mereka (hampir) dapat dipertukarkan dengan sempurna di banyak domain.
Jadi akan sangat dihargai jika seseorang dapat menjernihkan situasi! Terima kasih
virtual
dan beberapa fitur lain yang mencegah optimalisasi, tetapi misalnya non-virtual
kelas tidak inheren tidak efisien, dan templat adalah alat abstraksi kuat yang benar-benar dapat menyebabkan lebih efisien - misalnyaqsort
vsstd::sort
). (2) Pentingnya kebenaran adalah alasan untuk menggunakan C ++ (ketelitian,const
ketelitian,private
RAII untuk membuat pengelolaan sumber daya dapat dikelola, dll.) Di atas C. Atau dalam hal ini, gunakan Ada atau sesuatu di tempat pertama.void*
ke tipe pointer lain dalam kode C, itu sangat mengganggu dan tipikal orang yang tidak tahu C.Jawaban:
Anda memilih C kapan
Dalam semua kasus lain, Anda harus memilih C ++.
sumber
Ada beberapa alasan untuk memilih C. Yang utama adalah bahwa ia cenderung lebih sulit untuk menghasilkan executable yang benar-benar kecil dengan C ++. Untuk sistem yang sangat kecil, Anda jarang menulis banyak kode, dan ruang ROM tambahan yang akan dibutuhkan untuk C ++ daripada C dapat menjadi signifikan.
Saya juga harus menambahkan, bahwa untuk sistem yang sangat kecil, C memiliki masalah dengan alasan yang persis sama, dan bahasa assembly hampir merupakan satu-satunya pilihan yang masuk akal. Rentang ukuran sistem di mana C benar-benar masuk akal cukup kecil, dan menyusut terus-menerus (meskipun saya akui, cukup lambat).
Waktu / alasan lain untuk menggunakan C adalah untuk menyediakan satu set fungsi yang dapat Anda ikat dari dasarnya bahasa lain. Anda dapat menulis fungsi-fungsi ini dalam C ++ dengan mendefinisikannya sebagai
extern "C"
fungsi, tetapi hal itu membatasi fungsi-fungsi tersebut untuk menghadirkan "wajah" kehidupan-C yang esensial bagi dunia - kelas, fungsi yang kelebihan beban, templat, dan fungsi anggota, dll., Tidak perlu menerapkan. Ini tidak selalu membatasi pengembangan ke C - sangat masuk akal untuk menggunakan segala macam fitur C ++ secara internal , selama antarmuka eksternal terlihat seperti C.Pada saat yang sama, saya harus mengatakan bahwa jawaban @ Toll (untuk satu contoh yang jelas) memiliki hal-hal yang mundur dalam banyak hal. C ++ yang ditulis secara wajar umumnya akan setidaknya secepat C, dan seringkali setidaknya sedikit lebih cepat. Keterbacaan umumnya jauh lebih baik, jika hanya karena Anda tidak terkubur dalam longsoran semua kode bahkan untuk algoritma dan struktur data yang paling sepele, semua penanganan kesalahan, dll.
Template tidak "memperbaiki masalah dengan sistem jenis bahasa", mereka hanya menambahkan sejumlah kemampuan mendasar yang hampir sepenuhnya tidak ada dari C dan / atau C ++ tanpa template. Salah satu tujuan awal adalah menyediakan wadah yang aman untuk jenis, tetapi pada kenyataannya mereka jauh melampaui itu - pada dasarnya tidak ada yang disediakan C sama sekali.
Alat otomatis sebagian besar adalah herring merah juga - sementara memang benar bahwa menulis parser C kurang bekerja daripada menulis parser C ++, kenyataannya adalah bahwa itu membuat hampir tidak ada perbedaan pada akhirnya. Sangat sedikit orang yang bersedia atau mampu menulis parser yang dapat digunakan untuk salah satu dari keduanya. Dengan demikian, titik awal yang masuk akal adalah Dentang baik.
Seperti yang terjadi, C dan C ++ cukup sering digunakan bersama pada proyek yang sama, dikelola oleh orang yang sama. Hal ini memungkinkan sesuatu yang sebaliknya sangat jarang terjadi: sebuah penelitian yang secara langsung, secara obyektif membandingkan pemeliharaan kode yang ditulis dalam dua bahasa oleh orang-orang yang sama-sama kompeten secara keseluruhan (yaitu, orang yang sama persis). Setidaknya dalam penelitian terkait, satu kesimpulan jelas dan tidak ambigu: "Kami menemukan bahwa menggunakan C ++ bukannya C menghasilkan peningkatan kualitas perangkat lunak dan mengurangi upaya pemeliharaan ..."
sumber
Perbedaan antara C dan C ++ telah disebutkan secara rinci di sini . Meskipun kadang-kadang orang mungkin memiliki alasan yang sah untuk memilih satu atau yang lain (C ++ untuk OOP atau C ketika mereka merasa seperti fitur tambahan C ++ memperkenalkan overhead yang tidak diinginkan, misalnya), dalam pengalaman saya biasanya hanya tergantung pada preferensi. Apa yang orang-orang yang bekerja di file ini tahu lebih baik dan lebih suka? Saya percaya ini adalah alasan sebagian besar waktu, karena memang benar bahwa kedua bahasa ini menangani aplikasi kritis kinerja.
(Catatan tambahan: Lihat kata-kata kasar Linus Torvads tentang mengapa ia lebih suka C ke C ++. Saya tidak perlu setuju dengan poinnya, tetapi itu memberi Anda wawasan tentang mengapa orang mungkin memilih C daripada C ++. Sebaliknya, orang yang setuju dengannya mungkin memilih C karena alasan ini.)
sumber
-1
untuk kata-kata kasar Linus. : - {Masalah utama yang hilang dari jawaban yang ada (pada saat posting ini) adalah pilihan.
Itu mudah. Jika, karena alasan yang sangat tidak masuk akal, Anda merasa bahwa pengecualian tidak sebanding dengan biaya overhead, maka Anda tidak perlu menggunakannya . Anda masih dapat memiliki templat, dan RAII, dan pustaka standar, dan tidak pernah menulis satu pun "lemparan". Hal yang sama berlaku untuk template. Jika, karena alasan tertentu, Anda merasa mereka menyebabkan bloat yang tidak dapat dibatalkan (dan sebenarnya penting, yang hanya ada di embedded), maka Anda dapat menggunakan void * dan sizeof (T) sepanjang hari juga. Tidak ada yang memaksa Anda untuk menggunakan salah satu fitur C ++ di atas C.
Itu sebabnya C ++ adalah bahasa yang secara inheren unggul - Anda dapat memilih fitur yang Anda inginkan, dan kembali ke pemrograman gaya-C ketika Anda tidak menyukai fitur yang diberikan. Oleh karena itu, mengingat bahwa C ++ adalah segalanya C dan banyak lagi, itu adalah fakta yang jelas bahwa C ++ adalah bahasa yang unggul. Menyarankan sebaliknya sama dengan mencoba menyarankan bahwa 4 lebih besar dari 5.
sumber
Hal-hal tentang C ++ yang membuat programmer C gugup
Ada banyak keajaiban terjadi di bawah tenda; konstruktor, destruktor, metode virtual, templat, dll., dapat membuat kode C ++ jauh lebih mudah dan lebih cepat untuk ditulis daripada kode C yang setara, tetapi lebih sulit untuk dipahami dan dijelaskan (tergantung pada seberapa baik Anda mengetahui C ++ dan konvensi terkait). Sesuatu yang sesederhana
Foo newFoo;
mungkin memanggil banyak kode, tergantung pada bagaimana konstruktor untuk kelasFoo
(dan semua kelas yang bergantung padanya) telah didefinisikan. Inilah sebabnya mengapa konvensi ini adalah menulis++it
alih-alihit++
ketika iterasi melalui suatu wadah, karena postfix++
sering melibatkan operasi penyalinan yang mahal.Tergantung pada apa yang Anda lakukan, mungkin ada beberapa overhead non-sepele, terutama untuk tugas-tugas sederhana. Ambil dua program berikut, yang pertama di C, yang kedua di C ++:
Perilaku identik, tidak banyak perbedaan dalam hal sumber, tetapi pada kotak 10 SLES saya bekerja dengan gcc 4.1.2, yang pertama menghasilkan executable ~ 9kb dalam ukuran, sedangkan yang kedua mengambil lebih dari 12.5kb (tidak ada optimasi ), hampir 28% lebih besar. Tipe C ++
string
jauh lebih mudah untuk bekerja dengan IMO daripada pustaka string C, dan stream C ++ jauh lebih fleksibel dan dapat dikustomisasi daripada stream C, tetapi untuk kode yang benar-benar mati otak seperti ini, mereka mungkin tidak sebanding dengan overhead.C ++ adalah bahasa yang sangat besar dibandingkan dengan C, dengan beberapa semantik yang sangat kompleks. Dibutuhkan jauh lebih lama untuk menjadi mahir dengan C ++ daripada C, yang berarti banyak orang yang mengaku tahu C ++ tidak mengetahuinya sebaik yang mereka kira.
Hal-hal tentang C yang membuat programmer C ++ gugup
C bukan bahasa pemrograman yang aman oleh imajinasi apa pun; tidak ada batas memeriksa pada array menyebabkan banyak perilaku dieksploitasi (baik itu melalui sekarang-mati
gets
fungsi, atau melaluiscanf
dengan%s
dan%[
specifier konversi). C ++ setidaknya memberi Anda wadah yang melempar pengecualian jika Anda mencoba mengakses di luar kisaran yang ditentukan saat ini; semua C memberi Anda adalah (jika Anda beruntung) pelanggaran segmentasi.Manajemen memori di C sangat padat karya dan rentan kesalahan, dibandingkan dengan alat yang disediakan C ++ untuk Anda. Jika Anda membangun wadah sendiri, Anda bertanggung jawab untuk mencocokkan semua
malloc
danfree
panggilan, memastikan alokasi berhasil, mencadangkan semua alokasi parsial jika terjadi kesalahan, dll. Dalam C ++, Anda hanya menambahkan item ke atau hapus item dari wadah. Jika ada masalah, pengecualian akan dilempar.Demikian pula, penanganan kesalahan dalam C adalah rasa sakit di pantat dibandingkan dengan alat C ++ menyediakan (yaitu, pengecualian). Apa yang benar-benar menyenangkan adalah ketika Anda telah mengalokasikan banyak memori dan kemudian menabrak dinding dalam pemrosesan Anda; karena Anda harus mundur, Anda harus melepaskan memori itu dalam urutan yang benar. Dengan prinsip-prinsip C ++ dan RAII, ini (relatif) mudah dilakukan.
Jadi kapan saya menggunakan satu di atas yang lain?
Jika apa yang Anda tulis adalah rawa sederhana, bacalah / hilangkan dengan itu / singkirkan aplikasi itu, yang perilakunya dapat dijelaskan secara bersih dalam hal input dan output, dan masalah kinerja, maka lebih suka C daripada C ++. Kalau tidak, lebih suka C ++
sumber
Bjarne Stroustrup menyimpan daftar aplikasi dan perusahaan yang menggunakan C ++; Anda dapat berdebat tentang pemrograman prosedural dan OOP semua yang Anda inginkan, tetapi Anda tidak dapat berdebat dengan hasil industri selama 20 tahun terakhir.
C ++ umumnya digunakan untuk proyek berskala besar, multi-man, dan kompleks di mana orang yang terpisah perlu bekerja pada komponen modularis. Anda dapat membangun dan memelihara kode yang termodulasi dalam C, tentu saja, tetapi sifat OOP yang melekat pada C ++ mengarah pada modularisasi yang lebih baik, kemampuan testabilitas, dan penggunaan kembali kode.
C ++ standard library (STL), dengan sendirinya hanya dengan vektor dan peta, adalah alasan yang cukup untuk menggunakan C ++.
C umumnya digunakan untuk sistem embedded.
Saya pribadi akan menggunakan C hanya jika ada beberapa perpustakaan yang hanya memiliki API C.
sumber
Saya akan mengatakan bahwa alasan utama mengapa saya akan memilih C daripada C ++, hanya ketika saya harus menggunakan "Kalau ini TELAH MENJADI 1000% stabil" semacam NASA.
C ++ adalah ~ 99% C ketika kita melihat kinerjanya, dan itu jauh lebih produktif. Jadi walaupun di C Anda dapat menulis kode yang akan lebih cepat daripada C ++ (Anda dapat menggunakan subset dari C ++ tanpa pengecualian, virtual, streaming, abstraksi, dll. Juga, tapi itu pada dasarnya C), waktu untuk mengoptimalkan setiap hal sialan sementara STL diuji dan sudah melakukannya, akan dikenakan biaya lebih banyak daripada perolehan kinerja kecil yang mungkin Anda raih, atau berkorban karena algoritma STL telah ditulis oleh kelompok ahli, dan Anda mungkin bukan ahli dalam segala hal.
Di sisi lain C ++ memiliki banyak abstraksi. Ketika dalam keadaan mereka bocor, ini membuat Anda kesulitan. Dan ada beberapa orang yang tahu 100% C ++ Gotcha, sementara, saya kira, ada lebih banyak yang tahu semua C Gotcha, jadi menulis solusi di mana setiap langkah dipahami sepenuhnya oleh semua anggota tim jauh lebih mudah di C.
Contoh: Apakah Anda tahu kapan
shared_ptr<smthn>
akan melebihi jumlah referensi, akankah ia mengeluarkan pengecualian? Hal-hal seperti ini tidak keren ketika Shuttle harus masuk kembali ke atmosfer, setidaknya kurasa begitu.Juga, penanganan pengecualian sangat, sangat sulit dibandingkan dengan kode kesalahan. Sulit untuk melihat apakah kelasnya 100% aman, dan mudah bocor. Banyak perwakilan tinggi menyatakan pendapat ini.
sumber
std::string
dan sejenisnya? Apakah Anda pernah mencoba menentukan platform tempatshared_ptr
penghitung akan meluap? Itu akan menjadi salah satu dari platform lucu. Dan jika Anda berpikir penanganan pengecualian sulit, Anda harus melihat sepotong kode C yang memeriksa setiap kemungkinan kesalahan pada setiap panggilan fungsi. (Saya akui kode seperti itu sulit didapat, tetapi ini hanya argumen yang lebih kuat terhadap pernyataan Anda.) Maaf, tapi ini benar-benar kotoran sapi.std::string
jika Anda tidak ingin alokasi dinamis. Anda akan menggunakanstd::basic_string<char, std::char_traits<char>, some_allocator_here>
.C adalah rakitan portabel dengan sintaksis yang lebih baik, memberikan programmer kendali penuh atas segalanya .
C ++ di sisi lain, melakukan banyak sihir yang funky (fungsi virtual, kelebihan muatan, konversi otomatis, dll.) Yang mungkin tidak diinginkan ketika Anda ingin memastikan Anda:
Dan ingin sesuatu yang sangat sederhana untuk dikerjakan, karena Anda fokus pada kinerja.
Tidak ada kejutan, dan itu sangat berharga.
Jika Anda ingin (dan saya merekomendasikannya), bacalah panduan pengkodean JSF tentang apa yang perlu Anda pikirkan saat menulis C ++ untuk kontrol avionik militer. Ada banyak jebakan di sana yang perlu Anda waspadai, dan itu bisa membuat Anda keluar. Bjarne adalah bagian dari dokumen itu, jadi dia tahu tentang apa itu.
Juga, C mengkompilasi seperti troll tersiram cahaya tersambar petir. C ++, OTOH, mungkin disponsori oleh orang yang sama yang berinvestasi di perusahaan SSD. :)
(Secara pribadi, saya lebih suka C ++, tapi saya juga tidak suka ......; ;-P)
sumber
int
64 bit, seseorang harus melemparkan setidaknya satu operan untukuint64_t
mencegah Undefined Behavior, tetapi harus dilemparkan ke 64 bit untuk tujuan menghitung hasil 32-bit adalah - dengan kata lain - "mengejutkan".(mengingat Anda memiliki keakraban yang sama dengan kedua bahasa)
Pergilah dengan C ++ kecuali tidak ada kompiler C ++ untuk platform Anda. Anda dapat menulis kode C ++ tanpa bagian bahasa apa pun yang tidak Anda sukai (tidak ada kelas, pengecualian, warisan virtual, apa pun batasan pribadi yang ingin Anda terapkan), dan kemudian pada suatu waktu di masa depan, jika Anda memutuskan ingin beberapa setelah semua fitur itu, maka Anda dapat dengan mudah menggunakannya. Tidak ada dalam C ++ yang mencegah Anda menulis kode gaya-C.
(diberikan alat yang setara dan pengetahuan pengembang) Tidak ada alasan untuk memilih C lebih dari C ++ asalkan platform Anda memiliki kompiler C ++. Anda dapat membatasi diri Anda sendiri ke subset dari bahasa yang Anda inginkan hari ini, sambil membiarkan pintu terbuka untuk perpanjangan nanti.
sumber
Kedua bahasa sangat bagus. Saya pikir sejumlah poster telah merinci kekuatan dan berbagai kegunaan untuk masing-masing poster. Saya hanya akan menambahkan ini:
Saya melihat bahasa C sempurna dalam 4 bidang: 1) Saya pikir itu adalah bahasa terbaik untuk digunakan ketika pertama kali belajar semua jenis pemrograman [dikombinasikan dengan beberapa Majelis dan pengetahuan tentang kode mesin], 2) sangat bagus untuk menulis driver, 3) tertanam perangkat lunak, dan 4) perangkat lunak sistem pada tingkat terendah.
C ++ adalah bahasa berorientasi objek, tetapi juga bisa bersifat prosedural (sangat menghalangi C). Jika Anda bekerja pada proyek skala besar, perangkat lunak berbasis GUI, perangkat lunak game, dan jenis perangkat lunak intensif grafis lainnya, maka saya menemukan C ++, Java, atau bahkan Objective-C sebagai pilihan terbaik Anda. Namun, ada banyak program command-line atau perangkat lunak sistem di mana Anda mungkin menemukan C ++ lebih baik atau lebih baik daripada C.
sumber
Menurut pendapat saya ada satu hal yang hilang dalam diskusi ini: Lebih sederhana dalam C untuk menyediakan antarmuka biner yang stabil dari perpustakaan. Baik untuk penggunaan dengan bahasa lain maupun C ++.
Dalam C ++ kompiler yang berbeda menggunakan susunan nama yang berbeda sehingga konsumen perpustakaan yang dikompilasi dengan kompiler yang berbeda dari perpustakaan mungkin memiliki masalah dalam menggunakannya. Dengan C antarmuka biner, biasanya, distandarisasi untuk platform.
Saya tahu bahwa kompiler saat ini sering memiliki sakelar untuk menghasilkan hal-hal yang kompatibel dengan gcc, tetapi itu tidak selalu membantu.
Saya mengamati ini pada Solaris relatif sering. Distribusi dan vendor perangkat lunak yang berbeda biasanya menggunakan Sun Studio sebagai, terutama pada sistem Sparc, seringkali memberikan hasil yang lebih baik. Proyek sumber terbuka manusia ditulis dengan kode khusus gcc. Bisa jadi cukup menyakitkan untuk membuat mereka bekerja bersama.
sumber
C mungkin lebih disukai daripada C ++ ketika kode C dihasilkan (misalnya dalam implementasi bahasa tingkat tinggi). Sebagai contoh, ada beberapa kompiler Lisp-like yang memancarkan kode C (misalnya Chicken , Scheme48 ...), tapi saya tidak tahu yang memancarkan kode C ++ asli ( alat MELT saya memancarkan kode C ++, tapi saya tidak akan menyebut kode itu asli Kode C ++, menggunakan sangat sedikit fitur C ++).
Kode C juga lebih mudah dibuktikan secara semi-otomatis. Analisis statis seperti Frama-C (di mana Anda membubuhi keterangan kode C Anda dengan komentar ACSL untuk membantu alasan yang tepat tentang kode Anda) tersedia untuk C, tetapi tidak sebanyak itu untuk C ++ 11 penuh.
sumber