Om du ställer två personer som verkligen kan programmera C++ och C mot varandra och ger dem samma uppgift så kommer C++ bli det snabbare alternativet i genomsnitt. Finns helt enkelt tekniker man kan använda i C++ som ger kompilator optimeringsmöjligheter som inte finns i C. Naturligtvis är det rent tekniskt möjligt att handoptimera C-koden så den blir identisk med C++, men det skulle ofta resultera i kod som är hopplös att underhålla.
Notera att jag skrev "i genomsnitt", i de flesta fall skulle programmen prestera i stort sett identiskt.
Ett exempel, sortering är snabbare i C++ därför att kompilatorn kommer göra s.k. "template specialization" av std::sort just för "sekvens av heltal" och går därför att göra optimeringar i form av direkta anrop till funktion som jämför element, specialiserad funktion som byter plats på två element etc. I C kan man också skriva generella algoritmer, men polymorfismen får man hantera via indirekta anrop (ungefär dubbelt så dyra som direkta anrop och svårare för en CPU att "gissa") och generell funktion som byter plats på två element.
Kör du detta ser du att sortering av heltal i C++ är 50%-100% snabbare. Har inget med underliggande algoritmen i std::sort vs qsort att göra utan är en ren effekt av det jag skrev ovan.
#include <stdlib.h>
#include <algorithm>
#include <vector>
std::vector<int> seqMake(size_t cnt)
{
std::vector<int> seq;
for (size_t i = 0; i < cnt; i++) {
seq.push_back(rand());
}
return seq;
}
static int intCmp(const void * a, const void * b)
{
return *(int *)a - *(int *)b;
}
int main(int argc, char *argv[])
{
auto seq = seqMake(10000000);
if (argc > 1) {
qsort(seq.data(), seq.size(), sizeof seq[0], intCmp);
} else {
std::sort(std::begin(seq), std::end(seq));
}
}
Däremot går faktiskt inte C++ att använda för t.ex. OS, det går att använda en delmängd av C++ även i en OS kärna men där har ni nog den stora anledningen varför C än i dag i praktiken är det enda man skriver OS med. T.ex. så är undantag (eng. exceptions) totalt förkastligt i en OS-kärnan och går inte att ha sådana på ett tillförlitligt sätt där.
Är däremot fullt möjligt att använda en delmängd av C++ och göra t.ex. drivers till Linux (man skulle aldrig få in något sådant i kernel.org kärnan men det är tekniskt möjligt att skriva). Enda restriktionen är att man inte får använda något ur standardbiblioteket, man får inte använda RTTI, exceptions och liknande samt att det gränssnitt som exporteras ur modulen måste ha s.k. "C-linkage".
Det sista är ännu en anledning varför man inte använder C++ i OS. I C++ kan en flera funktioner/metoder ha samma namn men olika argument (en form av polymorfism), för att hantera detta i länkare måste då namnet på funktionen "manglas/dekoreras". Hur denna dekorering går till har aldrig standardiseras så om man använder C++ i ett OS gör man OSet beroende av en specifik kompilator!
I C finns standardregler för vilket namn funktioner/variabler får i länksteget -> går att använda olika kompilatorer och ändå garantera kompatibilitet på en specifik plattform.
Sist men absolut inte minst: OS-kärnor och andra komponenter som typiskt lever i >30 år bara måste byggas på teknik som först och främst är stabil. Att nästan inget händer med C är alltså en fördel här. Vidare är det inte möjligt att orsaka några som helst implicita anrop i C, det är väldigt viktigt för OS-kärnor och kringliggande komponenter som används i system som bara inte får gå fel. Är i stort sett hopplöst att bevisa att kod skrivet i språk med implicita anrop, undantag och andra saker som resulterar i att programflödet inte är trivialt.
Ex:
Hur många anrop och hur många vägar finns det i koden ovan i C? Är trivial, en!
I C++? Tja, kan bli ett anrop som konverterar "bar" till typen som foo() tar med tillhörande anrop till destruktor. Kan bli ett anrop till en casting operator för att konvertera det foo() returnerar till SomeType. Det kanske värsta är: foo() kanske inte alls returnerar utan resulterar i ett undantag.
Vilken av ovan vill du att styrsystem i det flygplan du åker med är utvecklat med? Eller vilket vill du se i din hjärt/lungmaskin under en operationer?
OBS: detta är inte en bashing av C++ utan ett försökt till svar på TS fråga. Skulle välja C++ varje dag i veckan över C om jag fick uppgiften att utveckla ett spel, ett ordbehandlare, ett webbläsare, en webbserver. Typ alla "vanliga" applikationer skulle jag välja C++ över C. Men för OS och för kritiska applikationer är det svårt att slå C än i dag!