[C++] Tips och synpunkter till nybörjare

Permalänk

[C++] Tips och synpunkter till nybörjare

Hej alla glada och duktiga programmerare.

Jag håller på att lära mig programmering i allmänhet och C++ i synnerhet. Jag har just skrivit klart ett litet konsolprogram som delar upp heltal i sina primtalsfaktorer. För tillfället så klarar det av tal mellan -(2^64) och 2^64, (förutsatt att det kompileras på ett system som ser long long int som 64 bitar).

Jag har filat en del på källkoden för att det ska flyta så smidigt som möjligt, men jag anar att det finns saker som kan förbättras ändå. Oavsett om ni har tips vad gäller själva algoritmerna eller om ni bara har några allmäna synpunkter så får ni gärna delge mig dem, mitt mål är ju som sagt att lära mig. Jag har kommenterat koden så jag hoppas att den är lätt att följa.

En sak som jag själv funderar på är huruvida man kan snabba upp användandet av den länkade listan som jag har för att lagra alla uträknade primtal i. När jag bytte till att lagra primtalen i en länkad lista istället för i en array (eftersom det inte var så smidigt med en array med miljontals värden) så ökade tiden som programmet tog till nästan det dubbla. För tillfället så är den dubbellänkad (för det är väl list i C++-biblioteket?), vilket är onödigt eftersom jag bara går igenom den från början till slut och inte tvärtom. Kommer det att snabba upp programmet något att köra enkellänkad eller spar det bara plats i minnet?

Jag slänger upp källkoden och win32-binärer om någon vill ladda ner:
källkod (4155 B)
win32-binärer (73728 B)

Användningen är "prgm heltal".

EDIT: Att lägga koden inom [ code ]-taggar gjorde så att sidan blev väldigt bred så de som är intresserade får gärna ladda ner filen jag länkade till ovan istället.

Permalänk
Medlem

anledningen att vektorn är snabbare är för att dess användning passar bättre med cachens algoritmer. I vektorn använder du ofta efterföljande element, medan i listan kan du hoppa i stort sett slumpmässigt i minnet för att hämta nästa element. detta leder ofta till cachemissar och upp till flera hundra cyklers väntetid.

och sen en petitess:
den klarar nog bara tal mellan -(2^63) och 2^63-1.

Visa signatur

4 datorer: 9 cpuer (plats för 4 till), 10scsi+1satadisk, 7.75gb ram, bara Linux
http://isitfika.net http://code.kryo.se

Permalänk

Det förklarar varför det gick så pass mycket långsammare, men det är inte så mycket man kan göra åt det antar jag.

Angående petitessen:
Nej, det klarar faktiskt tal mellan -(2^64) och 2^64, inte -(2^64) och 2^64 själva men alla talen där emellan. Om du tittar i koden så ser du att jag läser av första tecknet i argv[1] och om det är "-" så flyttar jag om alla tecken så att det försvinner och lagrar en bool som talar om att det blir negativt. Sedan läser jag in det (numera) positiva talet till en unsigned long long int. Det blir ju samma faktorer oavsett om det är positivt eller negativt, förutom en (-1).
Allt för att få leka med lite större tal, nästa steg blir väl att lära sig hur man använder någon big-num-typ.

Permalänk
Medlem

ah, isåfall. jag kollade inte koden så noga.

klassen ZZ i NTL (http://shoup.net/ntl/) klarar godtyckligt stora heltal

Visa signatur

4 datorer: 9 cpuer (plats för 4 till), 10scsi+1satadisk, 7.75gb ram, bara Linux
http://isitfika.net http://code.kryo.se