Burada bazı geçerli cevaplar görüyorum, ancak biraz daha ayrıntıya gireceğim.
Bu metnin tüm duvarından geçmek istemiyorsanız, ana sorunuzun cevabı için aşağıdaki özete atlayın.
Soyutlama
Peki, bu durumda, ne için para ödüyorum?
Soyutlama için para ödüyorsun . Daha basit ve insan dostu kod yazmanın bir bedeli vardır. Nesneye yönelik bir dil olan C ++ 'da neredeyse her şey bir nesnedir. Herhangi bir nesneyi kullandığınızda, kaputun altında her zaman üç ana şey olacaktır:
- Nesne oluşturma, temel olarak nesnenin kendisi ve verileri için bellek tahsisi.
- Nesne başlatma (genellikle bazı
init()
yöntemlerle). Genellikle bellek tahsisi, bu adımdaki ilk şey olarak başlık altında gerçekleşir.
- Nesne imhası (her zaman değil).
Kodda görmüyorsunuz, ancak bir nesneyi her kullandığınızda yukarıdaki üç şeyin hepsinin bir şekilde gerçekleşmesi gerekir. Eğer her şeyi manuel olarak yapacak olsaydınız, kod çok daha uzun olurdu.
Şimdi, soyutlama ek yükü eklemeden verimli bir şekilde yapılabilir: yöntem inlining ve diğer teknikler hem derleyiciler hem de programcılar tarafından soyutlama ek yüklerini kaldırmak için kullanılabilir, ancak bu sizin durumunuz değildir.
C ++ 'ta gerçekten neler oluyor?
İşte, ayrılmış:
std::ios_base
Sınıf her I / ilgili O için temel sınıftır olan başlatılır.
std::cout
Nesne başlatılır.
- Dizeniz yüklenir ve iletilir
std::__ostream_insert
(adıyla önceden anladığınız gibi ) akışa bir dize ekleyen bir yöntemdir std::cout
(temel olarak <<
operatör).
cout::endl
de iletilir std::__ostream_insert
.
__std_dso_handle
geçirilir __cxa_atexit
, programdan çıkmadan önce "temizlik" sorumlu bir küresel işlev olan. __std_dso_handle
kendisi bu işlev tarafından kalan küresel nesneleri yeniden konumlandırmak ve yok etmek için çağrılır.
Yani C == kullanarak hiçbir şey için ödeme yapmıyor musunuz?
C kodunda çok az adım gerçekleşiyor:
- Dizeniz yüklenir ve kayıt
puts
aracılığıyla iletilir edi
.
puts
denir.
Hiçbir yerde nesne yok, dolayısıyla hiçbir şey başlatmaya / yok etmeye gerek yok.
Ancak bu, C'deki hiçbir şey için "ödeme yapmadığınız" anlamına gelmez . Hala soyutlama için ödeme yapıyorsunuz ve aynı zamanda C standart kütüphanesinin başlatılması ve dinamik çözünürlük printf
işlevi (veya aslında puts
herhangi bir format dizesine ihtiyacınız olmadığı için derleyici tarafından optimize edildi) hala başlık altında gerçekleşiyor.
Bu programı saf montajda yazacak olsaydınız, şöyle bir şey olurdu:
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
Bu da temel olarak yalnızca write
sistem çağrısını çağırmakla ve ardından sistem çağrısıyla sonuçlanır exit
. Şimdi , aynı şeyi başarmak için asgari olan bu olurdu.
Özetlemek
C çok daha çıplak kemiklidir ve sadece gerekli olan minimum değeri yapar, kullanıcıya tam kontrol sağlar, bu da istedikleri her şeyi tamamen optimize edebilir ve özelleştirebilir. İşlemciye bir kayıt defterine bir dize yüklemesini ve ardından bu dizeyi kullanmak için bir kütüphane işlevini çağırmasını söylersiniz. C ++ ise çok daha karmaşık ve soyuttur . Bu, karmaşık kod yazarken çok büyük bir avantaja sahiptir ve daha kolay yazılmasına ve daha insan dostu kodlara izin verir, ancak açıkçası bir bedeli vardır. Böyle durumlarda C ++ ile karşılaştırıldığında C ++ performansında her zaman bir dezavantaj olacaktır, çünkü C ++ bu temel görevleri yerine getirmek için gerekenden daha fazlasını sunar ve bu nedenle daha fazla ek yük getirir .
Ana sorunuza cevap :
Yediğim şeyler için para ödüyor muyum?
Bu özel durumda, evet . C ++ 'ın C'den daha fazlasını sunması gereken herhangi bir şeyden yararlanmıyorsunuz, ancak bunun nedeni C ++' ın size yardımcı olabileceği basit bir kod parçasında hiçbir şey olmaması: gerçekten C ++ 'a hiç ihtiyacınız yok.
Oh, ve sadece bir şey daha!
C ++ 'ın avantajları ilk bakışta belirgin görünmeyebilir, çünkü çok basit ve küçük bir program yazdınız, ancak biraz daha karmaşık bir örneğe bakın ve farkı görün (her iki program da aynı şeyi yapar):
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;
}
Umarım burada ne demek istediğimi açıkça görebilirsiniz. Kullandığınız daha düşük bir seviyede bellek yönetmek zorunda nasıl C Ayrıca ihbar malloc
ve free
Endekslemede ve boyutları hakkında daha dikkatli olmak gerekir, nasıl ve giriş alarak ve baskı sırasında çok özel olması gerekli ne.