Permalänk
Medlem

Lära sig C++, böcker

Hejsan,

Det finns massor av böcker idag rörande C++, gamla som nya. De senaste böckerna går ju igenom den nya standarden, C11.

Jag har boken C Primer Plus (5th Edition) som släpptes 2004. Tycker ni att jag skall läsa denna först, och sedan ge mig på en bok som går igenom den senaste standarden av C++?

Visa signatur
Permalänk
Medlem

Varför vill du över huvud taget lära dig C++?

Visa signatur

Intel Core i7 8700K, MSI GeForce GTX 1080 Ti 11GB Gaming X, Samsung 960 EVO 1TB, MSI Z370 GAMING M5, Corsair 32GB (4x8GB) DDR4 3200MHz CL16 Vengeance, EVGA Supernova G3 850W

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Permalänk
Medlem
Skrivet av Brajan:

Hejsan,

Det finns massor av böcker idag rörande C++, gamla som nya. De senaste böckerna går ju igenom den nya standarden, C11.

Jag har boken C Primer Plus (5th Edition) som släpptes 2004. Tycker ni att jag skall läsa denna först, och sedan ge mig på en bok som går igenom den senaste standarden av C++?

Ge dig på en som håller sig till nya standarden istället. Vissa saker har blivit mycket smidigare och automatiskt optimerade. Så det är onödigt att lära sig saker man behöver avlära sig senare.

Visa signatur

.<

Permalänk
Medlem
Skrivet av IceDread:

Varför vill du över huvud taget lära dig C++?

Varför inte?

Jag vill också lära mig C++ för att det verkar nyttigt att kunna. Min anledning är att jag vill programmera GUI med Qt på Linux och känner att jag vill komma närmare hårdvaran än med Python. Dessutom för embedded programmering exempelvis på ARM mikrokontrollers så är C++ ett alternativ till enbart C. Vill man hålla på med spelutveckling (jag är själv inte så intresserad av just detta men ändå) så är C++ ett bra val.

Permalänk
Medlem
Skrivet av oelrich:

Ge dig på en som håller sig till nya standarden istället. Vissa saker har blivit mycket smidigare och automatiskt optimerade. Så det är onödigt att lära sig saker man behöver avlära sig senare.

Är det inte bra att lära sig en äldre version av C++, om man nu skulle få för sig att dra hem ett projekt ifrån Github som använder sig av en äldre standard? Kommer man inte har bättre att förstå sig på projektet då om man har båda erfarenheterna inom standarderna?

Visa signatur
Permalänk
Medlem
Skrivet av ronnylov:

Varför inte?

Jag vill också lära mig C++ för att det verkar nyttigt att kunna. Min anledning är att jag vill programmera GUI med Qt på Linux och känner att jag vill komma närmare hårdvaran än med Python. Dessutom för embedded programmering exempelvis på ARM mikrokontrollers så är C++ ett alternativ till enbart C. Vill man hålla på med spelutveckling (jag är själv inte så intresserad av just detta men ändå) så är C++ ett bra val.

När man vill lära sig ett språk är det ofta för att utföra något. Alltså, varför vill ni lära er C++, vad ämnar ni göra? Labba med lite spelprogrammering?

Visa signatur

Intel Core i7 8700K, MSI GeForce GTX 1080 Ti 11GB Gaming X, Samsung 960 EVO 1TB, MSI Z370 GAMING M5, Corsair 32GB (4x8GB) DDR4 3200MHz CL16 Vengeance, EVGA Supernova G3 850W

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Permalänk
Datavetare
Skrivet av IceDread:

Varför vill du över huvud taget lära dig C++?

Kanske därför att ISO-C11 och ISO-C++11 är de enda språken som än så länge lyckats abstrahera de fundamentalt viktiga delarna för att skriva korrekta och effektiva program som använder flera CPU-kärnor?

Java är väl närmaste konkurrent på den punkten, men det är inte alls lika generellt och på en del sätt också svårare att använda.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Kanske därför att ISO-C11 och ISO-C++11 är de enda språken som än så länge lyckats abstrahera de fundamentalt viktiga delarna för att skriva korrekta och effektiva program som använder flera CPU-kärnor?

Java är väl närmaste konkurrent på den punkten, men det är inte alls lika generellt och på en del sätt också svårare att använda.

Vill du skriva så optimerad kod som möjligt så använder du assembler.

Btw, C# .net, Java, nyttjar flertjänor utmärkt via trådar och os. Extremt sällan man behöver högre effektivitet.

Visa signatur

Intel Core i7 8700K, MSI GeForce GTX 1080 Ti 11GB Gaming X, Samsung 960 EVO 1TB, MSI Z370 GAMING M5, Corsair 32GB (4x8GB) DDR4 3200MHz CL16 Vengeance, EVGA Supernova G3 850W

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Permalänk
Medlem

Jag har redan förklarat mina anledningar.

Det är väldigt svårt att själv skriva bättre optimerad kod i assembler än vad en C-kompilator presterar. C++ är näst intill lika effektivt som C. Ska man programmera nära hårdvaran finns det inte så många andra alternativ utom assembler då, men med assembler blir inte koden lika portabel. Men assembler är roligt och ökar förståelsen för hur en processor fungerar så det är inte fel att åtminstone prova på det någon gång.

Men nu handlade inte tråden om att ifrågasätta valet att vilja lära sig C++. Brajan ville ha råd om böcker. Jag själv vill också ha svar på den frågan så jag kommer bevaka tråden.

Permalänk
Medlem
Skrivet av Brajan:

Är det inte bra att lära sig en äldre version av C++, om man nu skulle få för sig att dra hem ett projekt ifrån Github som använder sig av en äldre standard? Kommer man inte har bättre att förstå sig på projektet då om man har båda erfarenheterna inom standarderna?

Jag tror inte det.

Mest för att det brukar gå rätt bra att förstå gammal kod. Skillnaden är att man får bättre grundvanor när det gäller att skriva ny kod.

Sen är nya standarden är bakåtkompatibel och gamla projekt skall gå att kompilera med kompilatorer som stödjer den.

De största skillnaderna är saker som att en modern kompilator kommer flytta data på ett smart sätt istället för att kopiera och så vidare.

Enda anledningen till att lära sig gamla standarden är om du tänker jobba med ett system där man inte kan eller får gå till en kompilator som stödjer den nya standarden. Men har man de kraven så tror jag inte att man är nybörjare.

Visa signatur

.<

Permalänk
Datavetare
Skrivet av IceDread:

Vill du skriva så optimerad kod som möjligt så använder du assembler.

Btw, C# .net, Java, nyttjar flertjänor utmärkt via trådar och os. Extremt sällan man behöver högre effektivitet.

Effektivitet är bara en del av vad jag refererar till. C11 och C++11 har primitiver som inte bara är långt mer effektiva än andra språk, de är mycket lättare att använda för de som skapat dem har äntligen förstått vad vi som skriver program för multicore behöver.

Och nej, C#/.Net suger verkligen på multicore jämfört med Java och är inte ens på banan jämfört med C11 och C++11. Det går definitivt att skriva korrekta program för multicore i C#, men det skalar apa över några enstaka CPU-kärnor.

Edit: Det du skriver om assembler är idag rätt fel. I praktiken kan ingen människa fullt ut hålla alla beroenden som finns i en modern out-of-order CPU för att lyckas skriva assembler som är mer effektiv än den assembler som skapas av en kompilator genererad från en riktigt bra C-programmerare. Faktum är att C11 och C++11 innehåller just saker som gör det möjligt att uttrycka vad man vill optimera för utan att man alls måste begripa saker som minneskonsistensmodell, out-of-order djup och vilka assembler-instruktioner som är mer effektiva på just den CPU-modell man kör på.

Finns saker som språket C inte kan uttrycka på ett sätt så man kan generera optimal SSE/AVX. Finns flera lösningar på det problemet, endera skriver man den koden i något som OpenCL eller liknande, använder ett färdigskrivet bibliotek eller så kan man i de flesta kompilatorer komma åt SSE/AVX-instruktioner direkt från C (kompilator gör däremot registerallokering och ser till att data kommer till/från register på ett optimalt sätt, så det är inte samma sak som att skriva assembler) via s.k. intrinsics

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av oelrich:

Jag tror inte det.

Mest för att det brukar gå rätt bra att förstå gammal kod. Skillnaden är att man får bättre grundvanor när det gäller att skriva ny kod.

Sen är nya standarden är bakåtkompatibel och gamla projekt skall gå att kompilera med kompilatorer som stödjer den.

De största skillnaderna är saker som att en modern kompilator kommer flytta data på ett smart sätt istället för att kopiera och så vidare.

Enda anledningen till att lära sig gamla standarden är om du tänker jobba med ett system där man inte kan eller får gå till en kompilator som stödjer den nya standarden. Men har man de kraven så tror jag inte att man är nybörjare.

Helt sant, C++11 och senare är på många sätt en annat språk än tidigare C++ versioner. Herb Sutter belyser flera av skillnaderna mellan "gamla" C++ och "nya" C++ i denna video: Not Your Father's C++

Edit: då jag redan listat ett klipp med Herb Sutter och C++11 så är det kanske lika bra att lista denna mastodontsession om C++ atomic<>, är två klipp på ca en timme var och dessa är riktigt intressanta om man vill hålla på med multitrådning i C++11.
Atomic weapons part 1
Atomic weapons part 2

atomic<> är bara en väldigt liten del av allt man lagt till för multitrådning i C++, men det är en av punkterna där C++ (och C11 har liknande saker) skiljer sig (till det bättre) från andra språk. Faktum är att både C och C++ totalt saknade något alls i standaren för hur saker beter sig på multicore CPUer innan 2011 års standard. Notera också att C och C++ är separata språk med separat standard, dessa språk har divergerat en del så C är inte längre (sedan 1999) en delmängd av C++.

Här är en sammanställning av en presentation Sutter jag kring när C++ är ett bättre val än det han kallar "Coffee-based languages" (t.ex. C# och Java). Bl.a. nämner han att MS försök med att göra ett OS som i grunden var byggd på .Net totalt havererade (projektet startades i princip om och ledde till Vista ca 3 år senare än ursprungsplanen).
"However, as the OS was being developed, they realized that managed languages didn’t have the performance, deployability or serviceability (among others) required to develop an Operating System. That’s why Windows nowadays is all C and C++ and will probably stay that way."

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Hedersmedlem

Slänger in samma länk som senast en liknande tråd dök upp:

Skrivet av phz:

The Definitive C++ Book Guide and List [SO] — Stack Overflow har en rätt diger lista över C++-litteratur med sammanfattningar, ordnade efter nivå.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av Yoshman:

Effektivitet är bara en del av vad jag refererar till. C11 och C++11 har primitiver som inte bara är långt mer effektiva än andra språk, de är mycket lättare att använda för de som skapat dem har äntligen förstått vad vi som skriver program för multicore behöver.

Och nej, C#/.Net suger verkligen på multicore jämfört med Java och är inte ens på banan jämfört med C11 och C++11. Det går definitivt att skriva korrekta program för multicore i C#, men det skalar apa över några enstaka CPU-kärnor.

Edit: Det du skriver om assembler är idag rätt fel. I praktiken kan ingen människa fullt ut hålla alla beroenden som finns i en modern out-of-order CPU för att lyckas skriva assembler som är mer effektiv än den assembler som skapas av en kompilator genererad från en riktigt bra C-programmerare. Faktum är att C11 och C++11 innehåller just saker som gör det möjligt att uttrycka vad man vill optimera för utan att man alls måste begripa saker som minneskonsistensmodell, out-of-order djup och vilka assembler-instruktioner som är mer effektiva på just den CPU-modell man kör på.

Finns saker som språket C inte kan uttrycka på ett sätt så man kan generera optimal SSE/AVX. Finns flera lösningar på det problemet, endera skriver man den koden i något som OpenCL eller liknande, använder ett färdigskrivet bibliotek eller så kan man i de flesta kompilatorer komma åt SSE/AVX-instruktioner direkt från C (kompilator gör däremot registerallokering och ser till att data kommer till/från register på ett optimalt sätt, så det är inte samma sak som att skriva assembler) via s.k. intrinsics

Ja C++ är snabbare än C# och Java, nej inte snabbare än assembler. Däremot, tar mycket mer tid att koda assembler, och att korrigera någon annans assembler... tur jag inte behövt göra det, borde vara mycket tidskrävande.

.net's kompilator lämnar en del att önska, instämmer helt klart. Varför nämns ens temp variabler i CL...

Däremot så går det snabbare att skriva program som är snabba nog i C# och java där bägge också har en större mängd klara bibliotek att nyttja.

Behövs ordentlig optimering så är det fördelaktigt att se till C++ eller assembler.

Däremot, webtjänst, wcf, eller websida.. med C++ har jag svårt att se.

På grund av den här diskussionen, tack för den, börjar jag just se mig om igen. Nästan alltid vill företagen man utvecklar för att C# eller Java används och ofta är det befintliga program som behöver vidareutvecklas eller nytt program och snabbt skall det gå, projekten skall vara klara snabbast möjligt. Då väljs det ofta tyvärr att optimera i efterhand.

Ser ut som att Microsoft också pushar för C++, kan bli intressant.

Visa signatur

Intel Core i7 8700K, MSI GeForce GTX 1080 Ti 11GB Gaming X, Samsung 960 EVO 1TB, MSI Z370 GAMING M5, Corsair 32GB (4x8GB) DDR4 3200MHz CL16 Vengeance, EVGA Supernova G3 850W

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Permalänk
Datavetare
Skrivet av IceDread:

Ja C++ är snabbare än C# och Java, nej inte snabbare än assembler. Däremot, tar mycket mer tid att koda assembler, och att korrigera någon annans assembler... tur jag inte behövt göra det, borde vara mycket tidskrävande.

.net's kompilator lämnar en del att önska, instämmer helt klart. Varför nämns ens temp variabler i CL...

Däremot så går det snabbare att skriva program som är snabba nog i C# och java där bägge också har en större mängd klara bibliotek att nyttja.

Behövs ordentlig optimering så är det fördelaktigt att se till C++ eller assembler.

Däremot, webtjänst, wcf, eller websida.. med C++ har jag svårt att se.

På grund av den här diskussionen, tack för den, börjar jag just se mig om igen. Nästan alltid vill företagen man utvecklar för att C# eller Java används och ofta är det befintliga program som behöver vidareutvecklas eller nytt program och snabbt skall det gå, projekten skall vara klara snabbast möjligt. Då väljs det ofta tyvärr att optimera i efterhand.

Ser ut som att Microsoft också pushar för C++, kan bli intressant.

Att säga att C++ inte är snabbare än assembler är ett rätt meningslöst påstående. Visst, finns garanterat någon kombination av assemblerinstruktioner som kan lösa vissa fall bättre än den assembler som genereras från C++ av en kompilator. Men tar du tusen programmerare på måfå skulle jag vara ytterst imponerad mer än en/två stycken överhuvudtaget lyckas presterar något som är snabbare än det kompilatorn gör även om de får använda tio gånger så mycket tid som C++ programmeraren. En förkrossande majoritet av programmerarna kommer producera något som är långsammare än kompilatorn oavsett hur lång tid man ger dem. Så nej, rent praktiskt är C och C++ lika snabbt som assembler då dagens CPUer har så komplexa beroenden att de vida överstiger de ca 7 saker människor kan hålla i sin "L1-cache". En kompilator har inte alls samma begränsning på den punkten.

Kliver man in på multicore optimeringar är det långt viktigare att få till saker som vilket data som delar och inte delar cache-line med annan data, hur access till data är samordnat, m.m. Finns inget i assembler som gör detta mer effektivt än i C och C++, snarare att det är långt mer komplicerat då mycket av detta kan kompilatorer ordna åt dig bara man markerar sitt data på rätt sätt (tyvärr krävs ibland kompilatorspecifika attribut).

Att skriva assembler är inte så tidsödande som vissa verkar tro, har faktiskt skrivit hela spel på Amiga helt i assembler. Däremot är det ofta svårt att modifiera saker i efterhand då man måste helt förstå en människas ad-hoc användning av CPU-register och vad de representerar. Det är ett write-only language och det tar definitivt längre tid än att skriva i t.ex. C++.

Angående Microsoft och C++ så verkar de mycket riktigt hårdsatsa på detta språk igen. Finns videor på channel 9 (borde vara från 2011-2012), i serien som kallas "going native", där man pratar om att MS själva kom till insikten att hela deras företag är byggt på C++ men man hade under lång tid behandlat MSVC++ ganska styvmoderligt. Nu gör man en hårdsatsning på C++ och enligt Herb Sutter (som är både MS anställd och är/har varit ordförande i ISO C++ kommittén) ska man så långt som möjligt använda ISO C++ i stället för egna påhitt. Tyvärr är man inte helt hemma på den punkten då CX som används av WinRT (APIet inte Windows på ARM) är en icke-standardutökning.

Rent generellt så finns det inget i modern C++ som hindrar en att skriva mer eller mindre exakt samma kod som i C#, så utvecklingstiden i dessa språk är ungefär den samma förutsatt att man har tillgång till ungefär samma biblioteksfunktioner och att prestanda är irrelevant (annars vinner C++ på W.O.).

Forskning visar ju att om man skriver rubbet själv så är just val av språk rätt liten roll, bl.a. visade en rapport nyligen att ca 80% av alla buggar utvecklar skriver är buggar i logiken vilket gör val av språk helt irrelevant. Personligen tycker jag både C++ och C# är alldeles för komplicerade språk (hur många professionella C++/C# programmerare kan verkligen hela språkdefinitionen?) och föredrar språk där ett av huvudkriterierna är enkelhet, t.ex. Go, Clojure men även C pass in ok här. Däremot ser det definitivt ut som C++ kommer kliva upp i "viktighetsgrad" om man jobbar med Microsoftprodukter tack vare deras hårdsatsning på C++ och "native"-utveckling.

För att tillföra något vettigt till det TS frågar också: mitt tips är att titta på informationen hos cplusplus.com. Medan du läser böcker kan det vara väldigt värdefullt att titta på de standardfunktioner du ser i böckerna. Läser du t.ex. om std::all_of i <algorithm> så gå dit, läs om funktionen och framförallt titta igenom de exempel de har och se till att du förstår vad exemplen gör. Finns också en tutorial som är väl värd att gå igenom när du greppat grunderna, d.v.s. i alla fall kommit igenom en C++ bok.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Tillgång på biblioteksfunktioner är en intressant aspekt. Själv tänkte jag kolla på Qt och insåg att det då inte funkar så bra med enbart C-programmering (Qt är gjort för C++ om jag fattat rätt). Visst finns högnivåspråk som Python men de lägger man sig på ett lager ovanför native-stödet (vilket inte behöver vara ett problem). Eftersom jag numera använder KDE så har Qt plötsligt blivit intressantare för mig.

Vad jag menar är oavsett vilket språk man studerar så börjar man titta lite över gärsgårn och börjar tycka att gräset är grönare på andra sidan. Själv har jag tänkt att jag ska försöka bli bra på C men dessutom lära mig några andra språk som andrahandsval beroende på vilka bibliotek man vill utnyttja och vilken typ av program man vill skapa.

Där förstår jag också att .NET lockar för de som sitter på Microsoft-plattformar (jag har kört en del C# tidigare innan jag bytte till Linux). Men då jag mer är inne på Linux och gärna vill ha plattformsoberoende så känns .NET inte så lockande i praktiken (visst finns Mono men det blir ändå inget jättebra stöd för linux och andra plattformar). Java är väl kanske bästa valet för plattformsoberoende högnivåspråk. Fast det känns som C också är ganska plattformsoberoende så länge man kör med öppen källkod (man kan kompilera om det på andra plattformar). Men då gäller det att tänka på plattformsoberoendet från början antar jag så att man ser till att välja bibliotek som finns till de tänkta plattformarna. Qt verkade bra tänkte jag då det finns till många plattformar men då blir det väl C++ för bästa kompabiliteten med Qt.

Jag är alltså väldig nybörjare på C++ (typ Hello World). Men visst kan man köra "extern C" eller något sådant om man vill utnyttja bibliotek gjorda för C? Tänker mig om jag gör huvudsakliga utvecklingen i C och bygger på med C++ för användargränssnitt och funktioner som kräver bibliotek som är gjorda endast för C++. Fast det vore roligt att även lära sig C++ på riktigt så man vet vad det är bra och mindre bra till.

I mitt fall kanske det är vettigare att kombinera C med Python men ser det lite som en utmaning att testa C++. Java är väl heller inget dumt val eftersom jag kan en del C# men det blir nog rörigt att blanda allting samtidigt. Det sägs att Java och C# är väldigt lika varandra.

Yoshman: Visste hette du väl virtual void för inte alltför länge sedan? Avataren och allt stämmer förtutom användarnamnet. Eller har jag drömt detta?

Permalänk
Datavetare
Skrivet av ronnylov:

Tillgång på biblioteksfunktioner är en intressant aspekt. Själv tänkte jag kolla på Qt och insåg att det då inte funkar så bra med enbart C-programmering (Qt är gjort för C++ om jag fattat rätt). Visst finns högnivåspråk som Python men de lägger man sig på ett lager ovanför native-stödet (vilket inte behöver vara ett problem). Eftersom jag numera använder KDE så har Qt plötsligt blivit intressantare för mig.

Vad jag menar är oavsett vilket språk man studerar så börjar man titta lite över gärsgårn och börjar tycka att gräset är grönare på andra sidan. Själv har jag tänkt att jag ska försöka bli bra på C men dessutom lära mig några andra språk som andrahandsval beroende på vilka bibliotek man vill utnyttja och vilken typ av program man vill skapa.

Där förstår jag också att .NET lockar för de som sitter på Microsoft-plattformar (jag har kört en del C# tidigare innan jag bytte till Linux). Men då jag mer är inne på Linux och gärna vill ha plattformsoberoende så känns .NET inte så lockande i praktiken (visst finns Mono men det blir ändå inget jättebra stöd för linux och andra plattformar). Java är väl kanske bästa valet för plattformsoberoende högnivåspråk. Fast det känns som C också är ganska plattformsoberoende så länge man kör med öppen källkod (man kan kompilera om det på andra plattformar). Men då gäller det att tänka på plattformsoberoendet från början antar jag så att man ser till att välja bibliotek som finns till de tänkta plattformarna. Qt verkade bra tänkte jag då det finns till många plattformar men då blir det väl C++ för bästa kompabiliteten med Qt.

Jag är alltså väldig nybörjare på C++ (typ Hello World). Men visst kan man köra "extern C" eller något sådant om man vill utnyttja bibliotek gjorda för C? Tänker mig om jag gör huvudsakliga utvecklingen i C och bygger på med C++ för användargränssnitt och funktioner som kräver bibliotek som är gjorda endast för C++. Fast det vore roligt att även lära sig C++ på riktigt så man vet vad det är bra och mindre bra till.

I mitt fall kanske det är vettigare att kombinera C med Python men ser det lite som en utmaning att testa C++. Java är väl heller inget dumt val eftersom jag kan en del C# men det blir nog rörigt att blanda allting samtidigt. Det sägs att Java och C# är väldigt lika varandra.

Yoshman: Visste hette du väl virtual void för inte alltför länge sedan? Avataren och allt stämmer förtutom användarnamnet. Eller har jag drömt detta?

Bytte användarnamn av två skäl, "virtual void" var lite långt och namn med två ord är lite drygt för folk att referera till. Sedan heter min hund (som är en dvärgschnauzer precis som hunden i avataren) Yoshi och kallas ibland för Yoshman.

Att använda C-bibliotek från C++ kräver ingenting i normalfallet då i princip alla som jobbar med C har som del av kodstandard att lägga in

#ifdef __cplusplus extern "C" { #endif // exporterade funktioner och typer #ifdef __cplusplus } #endif

Skulle man stöta på ett C-bibliotek som mot förmodan saknar detta går det att lösa i sin egen C++ fil genom att göra detta

extern "C" { #include <some_c_library.h> }

C++ bibliotek som Qt och boost är i praktiken helt oanvändbara från C då de bygger på finesser som inte existerar i C. Anledningen till att så få bibliotek har C++ gränssnitt beror främst på två saker

  • C-bibliotek kan användas från C++, C++ bibliotek kan inte används från C. C är ett större språk än C++ räknat i antalet projekt och programmerare så inget man vill ignorerar

  • C-bibliotek är standardiserade ändå ner på binärnivå vilket betyder att ett bibliotek kan utvecklas med en kompilator och garanterat fungera med en annan kompilator. C++ är bara standardiserat på kodnivå, inte på binärnivå, så ett bibliotek som är kompilerat med säg g++ kanske inte fungerar i ett program som byggs med MSVC++. En stor anledning till att Microsoft har sin CX extension i WinRT kommer från att de måste ha bibliotek där även binären har en hår specifikation, CX är i stort sett en ny version av COM+ (som kommer från COM som kommer från OLE).

Är just att folk jämför C#/.Net med C++/STL som får många att dra slutsatsen att det går mycket fortare att skriva program i C#. Rätt jämförelse här är endera C# endast med CLI standard libraries alt. C++ med något som Qt eller WinRT. Tittar man på rent språkliga konstruktioner finns det egentligen väldigt lite i C# som inte har en ett-till-ett mappning i C++11, även saker som LINQ finns som bibliotekstillägg i C++ idag (fast med väldigt mycket bättre prestanda, men typiskt inte fullt lika mycket finesser).

Däremot har C++ möjlighet till s.k. template metaprogramming som gör det möjligt att åstadkomma väldigt extrema prestandaoptimeringar som är väldigt rättfram att använda för 3:e-part. Att skriva template libraries är däremot man ska lämna till folk som är C++-experter då det är väldigt många hål att kliva i. Stora delar av boost och även C++ standardbibliotek är just template-bibliotek.

Ett exempel som på ytan ser rätt lika ut i t.ex. C++ och C# men runtime-mässigt beter sig väldigt olika är tuples<>. Antag att man har en typ som håller en sträng och ett heltal

// C# var t = Tuple.Create("Kalle", 20); Console.WriteLine("name={0}, age={1}", t.Item1, t.Item2);

// C++ auto t = make_tuple("Kalle", 20); cout << "name=" << get<0>(t) << ", age=" << get<1>(t) << endl;

Kollar man genererad kod för detta kommer man ser att t.Item1 är ett anrop via en funktionspekare (väldigt dyrt, framförallt på enklare CPUer som Atom och ARM) medan det överhuvudtaget inte blir ett funktionsanrop alls i C++ då "anropet" körs i kompilator som då inser att man direkt kan stoppa in adressen till respektive datafält (en optimering som .Net överhuvudtaget inte gör, Java kan teoretiskt utföra denna optimering i runtime under vissa lägen om det är en JVM med re-JIT stöd).

Väldigt mycket som gör C++ snabbare än andra språk är att saker som ser ut som funktionsanrop endera blir direkta anrop (som är minst dubbelt så snabbas som indirekta anrop som anrop via funktionspekare är) eller inga anrop alls då kompilatorn gör om det till direkta datareferenser via template-magi. Programmeraren behöver inte bry sig om detta, det händer automatiskt och är egentligen ingen magi då det är en del av språkdefinitionen för C++ att göra dessa saker.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Jag skulle råda dig att iaf titta på boken Programming Principles and Practice using C++ av Bjarne Stroustroup (språkets skapare). ISBN: 9780321992789

http://www.bokus.com/bok/9780321992789/programming/

Visa signatur

Desktop: | Win10 | InWin 303 | ASUS TUF X570 | AMD Ryzen 5 3600 | Noctua NH-U12S (PP) | Intel 600p 256GB | Gigabyte GTX 670 | 32GB DDR4 2400Mhz | Corsair RM650x | 3x 1080 Screens |
Datacenter: | 1x Physical | 1x Virtual |
Laptop: | 2x |

Dell Certified Technician

Permalänk
Medlem

Tack Yoshman!

Låter jättebra att man kan använda C-bibliotek i C++ så pass enkelt. Så om man har bra kläm på C och hur man använder diverse bibliotek så har man nytta av dessa kunskaper när man lär sig C++ och dessutom får man tillgång till C++ bibliotek såsom Qt ifrån C++.

Permalänk
Medlem

C++ Primer (nyaste upplagan för C++11) Bästa C++ boken. Kan vara något svår i början dock om du inte programmerat tidigare.

Visa signatur

4090 | 7900x | Samsung Odyssey Neo G8 | Samsung G8 Oled 4K

Permalänk
Medlem
Skrivet av BlommaNN:

C++ Primer (nyaste upplagan för C++11) Bästa C++ boken. Kan vara något svår i början dock om du inte programmerat tidigare.

Ja den boken har jag börjat med och den verkar OK än så länge. Upplever den inte som svår ännu men har precis börjat och så har jag ju programmerat tidigare. Men tänkte bara nämna att man inte ska förväxla den med boken C++ Primer Plus som påstås vara en sämre bok. Verkar bra att boken går på C++11 direkt så man inte "lär dig fel".

Men visst finns det väl även C++14?
Jovisst det är på gång i alla fall: http://en.wikipedia.org/wiki/C%2B%2B14
"C++14 is intended to be a small extension over C++11, featuring mainly bug fixes and small improvements."

Tyvärr fattar jag knappt ett smack vad det handlar om. Får väl lära mig C++ 11 först...

Permalänk
Medlem
Skrivet av ronnylov:

Ja den boken har jag börjat med och den verkar OK än så länge. Upplever den inte som svår ännu men har precis börjat och så har jag ju programmerat tidigare. Men tänkte bara nämna att man inte ska förväxla den med boken C++ Primer Plus som påstås vara en sämre bok. Verkar bra att boken går på C++11 direkt så man inte "lär dig fel".

Men visst finns det väl även C++14?
Jovisst det är på gång i alla fall: http://en.wikipedia.org/wiki/C%2B%2B14
"C++14 is intended to be a small extension over C++11, featuring mainly bug fixes and small improvements."

Tyvärr fattar jag knappt ett smack vad det handlar om. Får väl lära mig C++ 11 först...

Ja förväxla verkligen inte med C++ Primer Plus som är helt oduglig. C++ Primer är en väldigt bra bok och även Linköpings Universitet rekommenderar den boken för C++. Nej du behöver inte bry dig om C++14 för tillfället. Ser till att du har koll på C++11 standarden först sedan kan du lära dig vad C++14 innebär. Du kommer bara bli förvirrad annars.

Visa signatur

4090 | 7900x | Samsung Odyssey Neo G8 | Samsung G8 Oled 4K

Permalänk
Medlem

Börja med "vanlig" C++, dvs utan C++11/14/17-features. Det är tillräckligt mycket att sätta sig in i Jag har skrivit C++ i 15-20 år (jobbat med det sen 8 år tillbaka) och det finns vissa delar av nya standarden som även jag har svårt att förstå.

Permalänk
Datavetare
Skrivet av grovlimpa:

Börja med "vanlig" C++, dvs utan C++11/14/17-features. Det är tillräckligt mycket att sätta sig in i Jag har skrivit C++ i 15-20 år (jobbat med det sen 8 år tillbaka) och det finns vissa delar av nya standarden som även jag har svårt att förstå.

Problemet med det rådet är att, som bl.a. Herb Sutter belyser i "Not Your Fathers C++" som jag länkade ovan, i C++11 och senare väljer man i många ganska grundläggande delar andra lösningar än i "klassisk" C++.

Bara för att ta en sak så skulle en "kassisk" C++ programmerare få spader om hen såg detta

vector<T> makeManyTs() { ... }

i stället skulle hen vilja ha detta

void makeManyTs(vector<T> &result) { ... }

Men i C++11 är det första garanterat att vara billigt (via move-semanic och rvalue references) och det är därför det rekommenderade sättet att skriva sådan kod.

Så lär man sig C++ finns ingen anledning att inte direkt lära sig "nya" C++, d.v.s. C++11. Fokus i C++14/17 är mest utökning av standardbilioteket och lite finputsning på syntax, inget kommer nära de kraftiga förändringarna som C++11 införde.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Är det någon som vet när Effective Modern C++ av Scott Meyers kan tänkas landa i lagret hos svenska näthandlare? Det ska ju vara en mkt bra bok för oss som redan "kan" C++, men som vill lära sig mer av vilken stil som förordas i C++11 och C++14. I USA släpptes den för ca 12 dagar sen.

Permalänk
Medlem

Accelerated C++ kan jag rekommendera.

Visa signatur
Permalänk
Medlem
Skrivet av BlommaNN:

Ja förväxla verkligen inte med C++ Primer Plus som är helt oduglig. C++ Primer är en väldigt bra bok och även Linköpings Universitet rekommenderar den boken för C++. Nej du behöver inte bry dig om C++14 för tillfället. Ser till att du har koll på C++11 standarden först sedan kan du lära dig vad C++14 innebär. Du kommer bara bli förvirrad annars.

Hej!

Jag lyckas inte hitta "facit" på övningsuppgifterna i boken. Är det inte meningen att man ska kunna se om man svarat rätt eller fel, eller är jag bara dålig på att hitta i boken? Är alltså boken C++ Primer jag håller på med.

Permalänk
Medlem
Skrivet av ronnylov:

Hej!

Jag lyckas inte hitta "facit" på övningsuppgifterna i boken. Är det inte meningen att man ska kunna se om man svarat rätt eller fel, eller är jag bara dålig på att hitta i boken? Är alltså boken C++ Primer jag håller på med.

Hej,
Det finns en separat bok för den 3:e utgåvan, C++ Primer Answer Book, men efter en snabb sökning verkar det inte som det finns för den 5:e. Någon annan kanske hittar bättre på nätet än jag gör?

En fråga dock. I en recension av 5:e upplagan, http://accu.org/index.php?module=bookreviews&func=search&rid=1848 så har recensenten använt ett utkast av boken och hittar inte något om lambdafunktioner. Finns det med något om dem i den färdiga boken?
Med vänliga hälsningar
squse

Permalänk
Medlem
Skrivet av squse:

Hej,
Det finns en separat bok för den 3:e utgåvan, C++ Primer Answer Book, men efter en snabb sökning verkar det inte som det finns för den 5:e. Någon annan kanske hittar bättre på nätet än jag gör?

En fråga dock. I en recension av 5:e upplagan, http://accu.org/index.php?module=bookreviews&func=search&rid=1848 så har recensenten använt ett utkast av boken och hittar inte något om lambdafunktioner. Finns det med något om dem i den färdiga boken?
Med vänliga hälsningar
squse

Jodå det finns litegrann om "lambda expressions" i avsnitt 10.3 i boken. Fast jag är bara på kapitel 2 ännu så jag har en bit kvar dit.
Introduceras så här:

Citat:

A lambda expression represents a callable unit of code. It can be thought of as an
unnamed, inline function. Like any function, a lambda has a return type, a parameter
list, and a function body. Unlike a function, lambdas may be defined inside a function.

Permalänk
Medlem
Skrivet av ronnylov:

Hej!

Jag lyckas inte hitta "facit" på övningsuppgifterna i boken. Är det inte meningen att man ska kunna se om man svarat rätt eller fel, eller är jag bara dålig på att hitta i boken? Är alltså boken C++ Primer jag håller på med.

Som du säkert märkt så finns det tyvärr inget facit. Men har du någon specifik fråga ställ den gärna så så skall jag nog kunna hjälpa dig.

Visa signatur

4090 | 7900x | Samsung Odyssey Neo G8 | Samsung G8 Oled 4K