Saya melihat beberapa jawaban yang valid di sini, tetapi saya akan sedikit lebih detail.
Lompat ke ringkasan di bawah ini untuk menjawab pertanyaan utama Anda jika Anda tidak ingin membaca seluruh dinding teks ini.
Abstraksi
Jadi, dalam hal ini, apa yang saya bayar?
Anda membayar abstraksi . Mampu menulis kode yang lebih sederhana dan lebih ramah manusia datang dengan biaya. Dalam C ++, yang merupakan bahasa berorientasi objek, hampir semuanya adalah objek. Saat Anda menggunakan objek apa pun, tiga hal utama akan selalu terjadi di bawah tenda:
- Pembuatan objek, pada dasarnya alokasi memori untuk objek itu sendiri dan datanya.
- Inisialisasi objek (biasanya melalui beberapa
init()
metode). Biasanya alokasi memori terjadi di bawah tenda sebagai hal pertama dalam langkah ini.
- Penghancuran objek (tidak selalu).
Anda tidak melihatnya dalam kode, tetapi setiap kali Anda menggunakan objek, ketiga hal di atas perlu terjadi. Jika Anda melakukan semuanya secara manual, kode jelas akan jauh lebih lama.
Sekarang, abstraksi dapat dibuat secara efisien tanpa menambahkan overhead: inlining metode dan teknik lainnya dapat digunakan oleh kompiler dan programmer untuk menghilangkan overhead abstraksi, tetapi ini bukan kasus Anda.
Apa yang sebenarnya terjadi di C ++?
Ini dia, rusak:
- The
std::ios_base
kelas diinisialisasi, yang merupakan kelas dasar untuk semua I / O yang terkait.
- The
std::cout
objek diinisialisasi.
- String Anda dimuat dan diteruskan ke
std::__ostream_insert
, yang (seperti yang sudah Anda ketahui namanya) adalah metode std::cout
(pada dasarnya <<
operator) yang menambahkan string ke aliran.
cout::endl
juga diteruskan ke std::__ostream_insert
.
__std_dso_handle
diteruskan ke __cxa_atexit
, yang merupakan fungsi global yang bertanggung jawab untuk "pembersihan" sebelum keluar dari program. __std_dso_handle
sendiri dipanggil oleh fungsi ini untuk mendelokasi dan menghancurkan objek global yang tersisa.
Jadi menggunakan C == tidak membayar apa pun?
Dalam kode C, sangat sedikit langkah yang terjadi:
- String Anda dimuat dan diteruskan ke
puts
melalui edi
register.
puts
dipanggil.
Tidak ada benda di mana pun, maka tidak perlu menginisialisasi / menghancurkan apa pun.
Namun ini tidak berarti bahwa Anda tidak "membayar" untuk apa pun di C . Anda masih membayar abstraksi, dan juga inisialisasi pustaka standar C dan resolusi dinamis printf
fungsi (atau, sebenarnya puts
, yang dioptimalkan oleh kompiler karena Anda tidak memerlukan format string) masih terjadi di bawah tenda.
Jika Anda menulis program ini dalam perakitan murni, akan terlihat seperti ini:
jmp start
msg db "Hello world\n"
start:
mov rdi, 1
mov rsi, offset msg
mov rdx, 11
mov rax, 1 ; write
syscall
xor rdi, rdi
mov rax, 60 ; exit
syscall
Yang pada dasarnya hanya menghasilkan memanggil write
syscall diikuti oleh exit
syscall. Sekarang ini akan menjadi minimum untuk mencapai hal yang sama.
Untuk meringkas
C adalah cara yang lebih sederhana , dan hanya melakukan minimum yang diperlukan, meninggalkan kontrol penuh kepada pengguna, yang mampu mengoptimalkan dan menyesuaikan sepenuhnya apa pun yang mereka inginkan. Anda memberi tahu prosesor untuk memuat string dalam register dan kemudian memanggil fungsi pustaka untuk menggunakan string itu. C ++ di sisi lain jauh lebih kompleks dan abstrak . Ini memiliki keuntungan yang sangat besar ketika menulis kode yang rumit, dan memungkinkan untuk lebih mudah untuk menulis dan kode yang lebih ramah manusia, tetapi jelas ada biaya. Akan selalu ada kelemahan dalam kinerja di C ++ jika dibandingkan dengan C dalam kasus-kasus seperti ini, karena C ++ menawarkan lebih dari apa yang dibutuhkan untuk menyelesaikan tugas-tugas dasar seperti itu, dan dengan demikian menambah lebih banyak overhead .
Menjawab pertanyaan utama Anda :
Apakah saya membayar untuk apa yang tidak saya makan?
Dalam kasus khusus ini, ya . Anda tidak mengambil keuntungan dari apa pun yang ditawarkan oleh C ++ lebih dari C, tetapi itu hanya karena tidak ada apa pun dalam potongan kode sederhana yang dapat membantu C ++: sangat sederhana sehingga Anda benar-benar tidak memerlukan C ++ sama sekali.
Oh, dan satu hal lagi!
Kelebihan C ++ mungkin tidak terlihat jelas pada pandangan pertama, karena Anda menulis sebuah program yang sangat sederhana dan kecil, tetapi lihatlah contoh yang sedikit lebih kompleks dan lihat perbedaannya (kedua program melakukan hal yang persis sama):
C :
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main(void) {
int i, n, *arr;
printf("How many integers do you want to input? ");
scanf("%d", &n);
arr = malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
printf("Index %d: ", i);
scanf("%d", &arr[i]);
}
qsort(arr, n, sizeof(int), cmp)
puts("Here are your numbers, ordered:");
for (i = 0; i < n; i++)
printf("%d\n", arr[i]);
free(arr);
return 0;
}
C ++ :
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int n;
cout << "How many integers do you want to input? ";
cin >> n;
vector<int> vec(n);
for (int i = 0; i < vec.size(); i++) {
cout << "Index " << i << ": ";
cin >> vec[i];
}
sort(vec.begin(), vec.end());
cout << "Here are your numbers:" << endl;
for (int item : vec)
cout << item << endl;
return 0;
}
Semoga Anda bisa melihat dengan jelas apa yang saya maksud di sini. Juga perhatikan bagaimana dalam C Anda harus mengelola memori pada tingkat yang lebih rendah menggunakan malloc
dan free
bagaimana Anda harus lebih berhati-hati tentang pengindeksan dan ukuran, dan bagaimana Anda harus sangat spesifik saat mengambil input dan mencetak.