22. februar 2003 - 10:44Der er
29 kommentarer og 2 løsninger
Forskellen mellem C og C++
Jeg vil gerne forstå forskellem mellem C og C++ :) Hvor ligger den rent kode-mæssigt. Jeg troede at konsol programmering med Borland C++ Builder (dem med cout mm) faktisk var ren C. Men det lader til at jeg nok har misforstået noget. Jeg sidder i en gruppe på Aalborg Universitet Esbjerg og vi har planer om at bygge et projektstyringssystem i PHP. De if-sætninger og løkker der eksisterer i php, minder meget om c++, eller er det kun c???
Så vidt jeg kan se er sproget c++ allerede over 20 år gammelt og opfundet af en dansker. Men hvordan fungerer den "gamle" c-kode så??
Populært sagt er C++ et superset af C (alt hvad du kan i C - næsten - kan du også i C++). Der er dog en del mere til det...
C er et proceduralt sprog og minder som sådan meget om pascal. Skriv en million funktioner og kald dem fra en million andre. Det er helt fint indtil der er for mange af dem. Overskueligheden forsvinder og spaghettien banker på...
C++ er objekt orienteret. Objekt orienteret programmering har taget den procedurelle indgangsvinkel et kæmpeskridt videre ved tilføjelsen af de tre hjørnesten i OOP: Indkapsling, nedarvning og polymorfisme (hedder det sådan på dansk?).
Indkapsling udvider den modul-baserede opbygning der kendes fra de precedurelle sprog. Data og operation stoppes ind i en klasse, der derefter kun kan bruges vha. et (forhåbentligt) veldefineret interface. Hvad der er inde i klassen og hvordan den fungerer er irellevant for brugeren.
Vha. af nedarvning kan man genbruge eksisterende klasser og udvide/specialisere disse.
Polymorfisme er hård at forklare, det skal prøves. Det er ekstremt brugbart, men man skal ha' fingrene i grøden for ligesom at forstå hvad det går ud på (og hvorfor det er smart). Jeg bruger det flittigt, men synes stadig det er enormt abstrakt. Det er lidt ligesom at køre bil; lær at bruge det, men prøv ikke at tænke for meget over det ;) Der er sikkert andre der kan vise nogle eksempler på hvorfor det er smart...
Lyder også som en glimrende forklaring, men jeg aner mildest talt ikke hvad en klasse er (en skoleklasse ?? )...:)
Jeg har gang i noget andet i et andet spg. med dig doctorseb - så du kan nok se at jeg er nybegynder. Dog så har jeg en middel erfaring med PHP/Mysql web-programmering, og her kommer C++ også ind i billedet...
Det er fordi jeg tror jeg har bildt folk ind at PHP ikke bruger C++ syntaks, men C - dette er forkert, er det ikke??
Vil det sige at det C jeg møder i bøger og andre steder, faktisk altid vil være C++ (nu står der jo også C++ på dem)... ??? Er C stadig brugt??
En klasse et et nøgle-begreb i objekt orienteret programmering.
En struct indeholder members. En class indeholder både members og methods (=funktioner). Sådan lidt forsimplet.
C og C++ deler rigtig meget syntax og for mange sprog så kan man tale om at de bruger C/C++ syntax.
Man bruger stadigvæk C mange steder. Der er stadigvæk en meget stor del af Unix/Linux programmering der laves i C. Der er stadig en meget stor del af embedded programmering der laves i C. På PC tror jeg de fleste idag bruger en C++ compiler.
Det er svært at sige om det er C eller C++ i de bøger du læser. Det afhænger jo af hvilke bøger det er.
Som arne_v skriver så er C's syntax meget lig C++'s. Jeg synes ikke det giver mening at snakke om, at ét sprog benytter et andet sprogs syntax. Derimod giver det mening at kategorisere dem. C og Pascal er procedurelle sprog. C++ og Object Pascal er objekt orienterede sprog. Der findes desuden funtionssprog, logiksprog og sikkert et hav andre. Jeg kender ikke PHP, men da det er populært scriptsprog vil jeg umiddelbart tro at det hører hjemme procedurelle...
C er stadig meget udbredt og bruges stadig regtig mange steder.
I OOP er en klasse populært sagt en klump der beskriver et stykke virkelighed(!). I C++ kan du f.eks. beskrive en bil således:
Brugeren (læs programmøren) af klassen bekymrer sig ikke om, hvordan bilen fungerer. Han kan alligevel kun bruge metoderne Start() og Stop(). Resten af klassen er lukket land for ham. Dermed INDKAPSLING. Han kan så specialisere klassen of f.eks. lave en Opel:
class COpel : public CBil { public: void TilfaeldigRustGenerator(); };
COpel har nu ARVET CBil's egenskaber, tilføjede sine egne særpræ og dermed specialiseret klassen.
CBil og COpel kan bruges som en hver anden type i C (C++)...
Der er visse syntax træk som en del sprog har arvet fra C/C++: {} i.s.f. begin end eller begin endxxx = i.s.f := == i.s.f. = != i.s.f. <> case sensitive for løkken do while i.s.f. repeat until
Der er en klar forskel på sprog der bruger C/C++ lignende syntax og sprog der bruger Pascal/Modula-2 lignende syntax.
cout er en stream defineret i C++ io bibliotek iostream.h, så det er IKKE ren C når du laver konsolprogrammer i C++ Builder, langt fra!
Hvis du er vant til C++ så vil du nok savne muligheden for funktions-overloading, som ikke findes i C. I C har du ikke nogen "new" operator - du skal allokere en stump hukommelse og initialisere den selv. Sålænge det er simple arrays osv. er forskellen nok ikke specielt stor, men hvis du bruger egne datastrukturer kan du straks mærke det. Du skal ligeledes selv frigøre hukommelsen, da du i C ikke har nogle destruktorer (da du ikke har klasser).
Sært at du nævner PHP i denne sammenhæng. PHP er sit helt eget sprog, men det er rigtig nok at syntaksen ligner C/C++/Java/JavaScript (og sikkert også andre). PHP er jo ikke et rigtigt programmeringssprog, det er et scriptsprog, og bør derfor ikke sammenligned med hverken C eller C++, selv hvis syntaksen var 100% den samme.
Der er dog nogle ting, der ikke umiddelbart er mulige med C, f.eks. polymorfi.
1. C++ er ikke et OO sprog, men et multiparadigme sprog. Du kan selv vælge om du vil kode proceduralt, objekt orienteret eller om du ville vride alt til templates. En styrke og en enorm ulempe.
2. (f)printf er ikke nær så elegant som iostreams. Du kan selv override stream operatoren og bestemme hvordan dine objekter skal streames. Desuden kan du streame til filer, netværk, zip filer osv osv. Desuden er iostreams typestærke, hvilket (f|s)printf ikke er hvorfor du kan lave noget være rod hvis din parameter liste ikke passer til din format streng.
3. Polymorfi er nemt at forklare: Det betyder i alt sin enkelthed at du får kaldt den metode der er knyttet til netop den instans du kalder metoden på uanset om du håndtere objektet via en pointer eller en reference til en base-klasse. For at udnytte dette skal du erklære dine metoder virtuelle
4. Angående tidligere forklaring om forskellen på struct og class så er den forkert. Den angivede forskel er forskellen mellem en C struct og en C++ class(/struct). I C++ er en struct og en class fuldstændig detsamme bortset fra at default acccessibility i en struct er public, mens den er private i en class, og at nedarvning fra en struct default er public, mens det default er private for en class.
Altså er det her det samme:
struct MyClass { MyClass() {} int myMethod(); private: int a; };
class MyClass { public: MyClass() {} int myMethod(); private: int a; };
5: Du kan godt lave polymorfi i C ved at bruge funktions pointere og gemme dem i din struct, så forskellen er ikke så meget ved tilstedeværelsen af polymorfi, som ved den forskel at C ikke har et indbygget klassebegreb.
6. Jeg kan slet ikke forstå at der ikke er nogen der har nævnt templates endnu. C++ er det mest udbredte programmeringssprog med support for parametriserede typer, hvilket betyder at man kan bevare den stærke statiske typing samtidig med at man opnår en del af den fleksibilitet som man har i dynamisk typede sprog. For at indse styrken af templates vil jeg anbefale at man kigger på STL/C++ standard librarys vector template og de algoritmer der findes til at operere på containere. Det viser lidt af styrken. Hvis man så kigger på koden kan man også se lidt af svagheden: Syntaksen for templates er meget "verbose" - og logikken kan let drukne i al den syntaks.
Men man skal passe rigtig godt på hvis man selv vil lave en template-klasse. At instantiere STL-klasser er ikke det store problem, men du kan komme ud i et frygteligt rod med eksplosion i kodestørrelsen (export ikke implementeret i nogen oversætter jeg kender), og mildt sagt besværlig kode hvis ikke du ved hvad du foretager dig. Som Bjarne Stroustrup selv skulle have sagt det:
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg."
Og det gælder efter min bedste overbevisning specielt med templates.
tson <- ad 4. Bortset fra doctorsebs udsagn "CBil og COpel kan bruges som en hver anden type i C (C++)..." hvor er det lige at nogen forklarer noget forkert om forskellen på structs i C og C++ ?
Templates er dejlige at have og at skrive :-) Men som jeg skrev er syntaksen efter min smag lidt voldsom. Uden templates er det statiske type system hele tiden i vejen. Jeg skriver Java og C# til daglig og her er der ikke support for parametriserede typer, hvilket betyder at næsten alt andet end den mest banale kode enten skal duplikeres (duplikeret kode er en dødssynd) eller også må man bruge object og en masse casting. Ærgeligt. Iøvrigt er parametriserede typer/templates med i java 1.5, det er vi nogle stykker der glæder os til. :-)
En sidebemærkning... C# oversat til DLL og kaldt fra ASP.NET er ca 6 gange hurtigere end C++ implementering kørt i CGI-program.... MEGET OVERRASKENDE!!!
Det er efter min mening en æbler til pære sammenligning. Det er unfair at sammenligne en "stateful" afvikling i ASP hvor applikationen bliver liggende i hukommelsen med en CGI afvikling hvor hele applikationen startes forfra for hver request. Det ville være mere fair at sammenligne kald fra ASP.NET til et C# og et C++ COM objekt.
CGI er jo en ekstrem simpel mekanisme hvor et http request omdirigeres til et separat program som startes med stdin og stdout omdirrigeret til processen og hvor eventuelle parametre er tilgængelige via kommandolinie params og/eller environment variable. Det er lidt tungt at starte et helt program for hvert request :-)
tson <- det er ikke afviklingen af hele programmet, men den del af det, hvor der foretages metodekald i et loop. Ja, det er klart at CGI nok er en del langsommere når det kommer til mange HTTP-requests/sekund, men da koden er oversat til maskinkode burde den køre hurtigere under behandlingen af et request, der kræver mange beregninger.
Heh, tror jeg fandt en forklaring: det hele skyldes memory management. I .NET (sålænge man ikke overskrider et eller andet tal) koster memory allocation til at inkrementere en pointer, og er derfor hurtig. Kilde: http://www.codeproject.com/csharp/strings.asp
stringbuffer: hvad er det for noget C++ kode du har oversat. hvordan har du foretaget måling. bruger C++ koden externe dll der først skal initialiseres. er det forskellige metoder der er brugt i C# og C++
Efter min bedste viden skulle C++ med en god optimering kun være til at slå af mere maskin nære programmeringsprog, som jeg ikke formoder includere C#. Det skulle dog være nemt at skrive ikke optimalt C++ kode eller ikke bruge alle optimeringerne i en god compiler, desværre kan jeg kun sigde at der er langt imellem at compiler producenterne lave god optimering.
Har lige lavet en implementering i ren C, den er også langsommere end C#.
Jeg har lavet et bibliotek/komponent til at arbejde med HTML-skabeloner, dvs. indsætte værdier i felter, gentage dokumentsektioner og andre, efter min mening, nyttige funktioner.
Målingen foretages ved at aflæse tid i millisekunder før, og efter kørsel af en løkke, hvor masse kald af komponentets metoder/procedurer foretages.
C# er jo oversat til en .NET .dll, mens C-koden bliver inkluderet i min main-fil, og alle funktioner er defineret som inline.
Både C# og C implementeringen bruger hægtede lister, så der er en del allokering af objekter (tekst og celler i lister).
Jeg er lidt af en performance maniac, og er ret sikker på at min C-kode ikke kan skrives meget mere optimalt.
Når der genereres 50 kategorier med 20 spørgsmål hver, og 20 svarmuligheder til hvert spørgsmål, får jeg på min maskine genereret output på under 70 ms fra ASP.NET og det tager ca. 140 ms fra et .exe program lavet i C. Og det var med optimering slået til i VC6
Sammenligner du stadig CGI med ASP.NET? Prøv at lave et tomt C++ CGI program som altså returnerere en tom side. Lav også en tom ASP.NET side. Lav så en måling af hvor hurtigt de afvikles. Hermed får du en ide om hvor dyr "opstarten" er for en C++ CGI løsning vs en ASP.NET løsning. Herefter bør du trække disse opstartstider fra dine eksisterende målinger for at lave en sammenligning af afviklingshastigheden for C++ og C# kode.
tson <- jamen vi er slet ikke ueninge mht. at omkostninger ved at starte et CGI-program er større end at loade et ASP-script, men det er ikke det, der er interessant i min situation.
Jeg har nu arbejdet som software ingeniør (og i forskning!) i ~12 år. Har nu oparbejdet en rimelig erfaring med og forståelse af C++ - samt andre sprog (Python). PHP har jeg dog ikke rørt ved i 10 år.
I skal have tak for hjælpen for ~17½ år siden. Det hjalp.
PS: Er meget sjældent herinde.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.