abonnement Unibet Coolblue Bitvavo
pi_115119396
quote:
0s.gif Op zondag 5 augustus 2012 00:05 schreef thabit het volgende:
Welke compiler gebruik je?
GNU GCC
pi_115119537
Okee, dan kun je gewoon -O3 (of -O2, is soms sneller) meegeven. Interessant om te kijken of dat nog steeds zo veel tijdsverschil geeft.
pi_115119957
quote:
0s.gif Op zondag 5 augustus 2012 00:10 schreef thabit het volgende:
Okee, dan kun je gewoon -O3 (of -O2, is soms sneller) meegeven. Interessant om te kijken of dat nog steeds zo veel tijdsverschil geeft.
Waar moet ik die -O3 of -O2 neerzetten?
pi_115120362
Bijvoorbeeld: gcc (of g++) -O3 blabla.cpp etc.
pi_115120949
Dan is er geen tijdsverschil meer
pi_115122079
quote:
14s.gif Op zondag 5 augustus 2012 00:40 schreef thenxero het volgende:
Dan is er geen tijdsverschil meer
Maar beste manier is gewoon om `x & 1' te gebruiken.
pi_115122625
quote:
0s.gif Op zondag 5 augustus 2012 01:04 schreef t4rt4rus het volgende:

[..]

Maar beste manier is gewoon om `x & 1' te gebruiken.
Maar dan ook alleen vanwege het probleem met + en -. :P.
pi_115123955
quote:
0s.gif Op zondag 5 augustus 2012 01:04 schreef t4rt4rus het volgende:

Maar beste manier is gewoon om `x & 1' te gebruiken.
Ben ik niet met je eens. Hiermee doe je namelijk een gevaarlijke aanname, namelijk dat 'oneven' gelijk is aan 'een 1 op het minst significante bit'. Dit is niet altijd zo: kijk bijvoorbeeld naar negatieve getallen in ones' compliment.

Je kunt volgens mij het beste schijven wat je bedoelt. Als je wilt weten of een getal even of oneven is, dan wil je weten wat de rest is na een deling door twee. Dat is x % 2: wiskundig gezien altijd juist, het werkt op elk systeem en iedereen weet onmiddelijk wat de code doet. Alleen als je het minst significante bit wilt hebben, schrijf je x & 1.

Alleen als je enkel voor jezelf aan het programmeren bent en je de code nooit op een ander system hoeft te gebruiken, kan je zulke aannames zonder veel problemen doen. Maar we hebben net al gezien dat er geen winst is qua snelheid: de compiler kan prima omgaan met zulke systeem-specifieke optimalisaties en doet het automatisch. Dus waarom zou je het zelf doen?

In mijn ogen levert het gevaarlijke, minder leesbare code op zonder dat je er iets mee opschiet. Dus gewoon schijven wat je bedoelt, niet wat je denkt dat het snelste is.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115124098
quote:
0s.gif Op zondag 5 augustus 2012 01:50 schreef GS42 het volgende:

[..]

Ben ik niet met je eens. Hiermee doe je namelijk een gevaarlijke aanname, namelijk dat 'oneven' gelijk is aan 'een 1 op het minst significante bit'. Dit is niet altijd zo: kijk bijvoorbeeld naar negatieve getallen in ones' compliment.
ones' compliment wordt nergens gebruikt... toch? :P
pi_115124177
quote:
0s.gif Op zondag 5 augustus 2012 01:54 schreef t4rt4rus het volgende:

ones' compliment wordt nergens gebruikt... toch? :P
Niet dat ik weet inderdaad, maar het punt blijft. :P
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115124213
quote:
0s.gif Op zondag 5 augustus 2012 01:56 schreef GS42 het volgende:

[..]

Niet dat ik weet inderdaad, maar het punt blijft. :P
Ok je hebt wel een punt... Maar toch :P

Is er nog iets leuks in C++ waar we over kunnen praten?
templates, classes?
pi_115124433
quote:
0s.gif Op zondag 5 augustus 2012 01:57 schreef t4rt4rus het volgende:

[..]

Ok je hebt wel een punt... Maar toch :P

Is er nog iets leuks in C++ waar we over kunnen praten?
templates, classes?
Misschien iets waar ik zelf een keer flink over gestruikeld ben, namelijk het verschil tussen static_cast en reinterpret_cast en wanneer je welke moet gebruiken. Bijvoorbeeld a) welke je gebruikt om van char naar int te casten, of van void* naar int* en b) waarom. Enig idee?
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115125656
quote:
0s.gif Op zondag 5 augustus 2012 02:03 schreef GS42 het volgende:

[..]

Misschien iets waar ik zelf een keer flink over gestruikeld ben, namelijk het verschil tussen static_cast en reinterpret_cast en wanneer je welke moet gebruiken. Bijvoorbeeld a) welke je gebruikt om van char naar int te casten, of van void* naar int* en b) waarom. Enig idee?
static_cast is om te casten van int naar double, enum naar int, unsiged <-> signed en van derived classes naar base class.

Met reinterpret_cast kan je gewoon alles doen en checkt je compiler volgens mij helemaal niks.
pi_115126240
Dus welke gebruik je om

1. van char naar int en
2. van void* naar int*

te casten en waarom? :)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115126666
quote:
0s.gif Op zondag 5 augustus 2012 03:07 schreef GS42 het volgende:
Dus welke gebruik je om

1. van char naar int en
2. van void* naar int*

te casten en waarom? :)
1. static_cast. char en int zijn types die hetzelfde weergeven (getallen), het enige verschil is dat een int meer bytes in beslag kan nemen.

Ohja was ik nog vergeten te vertellen, reinterpret_cast wil volgens mij alleen maar op pointers omdat deze altijd hetzelfde aantal bytes innemen. char en int kunnen verschillen van grootte en daarom kan een char niet herinterpreteren naar een int.

2. reinterpret_cast omdat je pointer naar een ander type verwijst.

[ Bericht 6% gewijzigd door t4rt4rus op 05-08-2012 10:32:26 ]
pi_115129176
En dan hebben we ook nog const_cast en dynamic_cast :)
pi_115131327
quote:
0s.gif Op zondag 5 augustus 2012 03:31 schreef t4rt4rus het volgende:

[..]

1. static_cast. char en int zijn types die hetzelfde weergeven (getallen), het enige verschil is dat een int meer bytes in beslag kan nemen.
Klopt inderdaad. Static_cast kan verschillende dingen doen, maar het converteert altijd tussen gerelateerde typen. Die relatie kan zijn:

- Zelfde soort fundamentele datatypes, zoals char en int beide integer-types zijn. Daarbij kan static_cast directe omzetting van bitpatronen gebruiken (waarbij er indien nodig naar beneden wordt afgerond).

- Een base, parent of composite verbinding van inheritance.

- Een constructor of operator Type() van classes.

Simpel gezegd: er moet een manier zijn om van A naar B te komen. Belangrijk om te realiseren is: static_cast<X>(Y) maakt een nieuw X-object aan en initialiseert dit met Y. Ze hoeven dus niet gelijk aan elkaar te zijn.

quote:
Ohja was ik nog vergeten te vertellen, reinterpret_cast wil volgens mij alleen maar op pointers omdat deze altijd hetzelfde aantal bytes innemen. char en int kunnen verschillen van grootte en daarom kan een char niet herinterpreteren naar een int.

2. reinterpret_cast omdat je pointer naar een ander type verwijst.
Ja, dat dacht ik eerst ook. Maar het is dus niet zo: void* is gerelateerd aan alle pointer typen en dus moet je gebruik maken van static_cast. Je hebt gelijk over de functie van reinterpret_cast: deze interpreteert een geheugenadres als een ander type. Hierbij verandert die cast gegarandeerd niets aan het geheugen: alles blijft zoals het is.

Het belangrijke hier is: een int* kan er anders uitzien in het geheugen dan een void* (of X*). Alleen de grootte is gegarandeerd hetzelfde, niet de memory-layout. DIt betekent dat er misschien werk moet worden gedaan om van een void* een int* te maken. En dat doet reinterpret_cast niet.

Er is 1 uitzondering op bovenstaand verhaal, namelijk als de void* die we proberen te casten, gemaakt is met reinterpret_cast<void*>(int*). Alleen in dat geval moet je terugcasten met dezelfde cast, om duidelijke redenen.

Dit vind ik niet duidelijk in de (online) naslagwerken staan, vandaar dat ik het vroeg. :)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115131654
quote:
0s.gif Op zondag 5 augustus 2012 11:56 schreef GS42 het volgende:

[..]

Klopt inderdaad. Static_cast kan verschillende dingen doen, maar het converteert altijd tussen gerelateerde typen. Die relatie kan zijn:

- Zelfde soort fundamentele datatypes, zoals char en int beide integer-types zijn. Daarbij kan static_cast directe omzetting van bitpatronen gebruiken (waarbij er indien nodig naar beneden wordt afgerond).

- Een base, parent of composite verbinding van inheritance.

- Een constructor of operator Type() van classes.

Simpel gezegd: er moet een manier zijn om van A naar B te komen. Belangrijk om te realiseren is: static_cast<X>(Y) maakt een nieuw X-object aan en initialiseert dit met Y. Ze hoeven dus niet gelijk aan elkaar te zijn.

[..]

Het belangrijke hier is: een int* kan er anders uitzien in het geheugen dan een void* (of X*). Alleen de grootte is gegarandeerd hetzelfde, niet de memory-layout. DIt betekent dat er misschien werk moet worden gedaan om van een void* een int* te maken. En dat doet reinterpret_cast niet.
Maar er hoeft helemaal geen werk worden gedaan. Alleen de pointer moet anders geherinterpreteerd worden.
Maar ik denk dat dit een uitzondering is op wat is toegestaan.

void * geeft al aan dat het onbekend is waar de pointer naar wijst. En ik denk dat ze daarom toe staan om te static casten naar een andere pointer type.
Netzoals je kan static casten van een Derived Class naar Base class.

Echter van char * naar int * of andersom kan niet met de static cast.

Ik lees zo wel even C++11 docu als ik die nog heb...
pi_115132044
5.2.7 t/m 5.2.11 gaan over casts.
Lees het straks wel even door :P

Zou ik het hier mogen posten...?
pi_115132079
quote:
Maar er hoeft helemaal geen werk worden gedaan. Alleen de pointer moet anders geherinterpreteerd worden.
Een pointer is ook een object, vergeet dat niet. En een void-pointer hoeft niet gelijk te zijn aan een int-pointer, dus moet er mogelijk werk worden gedaan.

quote:
En ik denk dat ze daarom toe staan om te static casten naar een andere pointer type.
Het wordt toegestaan omdat void* aan alle pointer-types is gerelateerd. Immers, void *a = &X is altijd geldig.

[ Bericht 0% gewijzigd door GS42 op 05-08-2012 17:00:12 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115132146
quote:
0s.gif Op zondag 5 augustus 2012 12:16 schreef GS42 het volgende:

[..]

Een pointer is ook een object, vergeet dat niet. En een void-pointer hoeft niet gelijk te zijn aan een int-pointer, dus moet er mogelijk worden gedaan.
Wat zou er gedaan moeten worden dan?
Memory adres is een memory adres wat er op de adres staat maakt helemaal niks uit.
pi_115133657
Ik heb dit boek thuis nog liggen (van mijn pa):

http://www.bol.com/nl/p/basiscursus-c/666842990/

Basiscursus C++ van L. Ammeraal uit 1997. Is er in de loop der tijd veel veranderd? Zou ik dit boek nog kunnen gebruiken?
pi_115133875
quote:
0s.gif Op zondag 5 augustus 2012 12:18 schreef t4rt4rus het volgende:

[..]

Wat zou er gedaan moeten worden dan?
Memory adres is een memory adres wat er op de adres staat maakt helemaal niks uit.
Wat er precies gedaan zou moeten worden, maakt niet zoveel uit. Het belangrijke is: C++ geeft geen garanties over pointer-representatie en dus hoeft een X* niet gelijk te zijn aan een Y*. Het kan bijvoorbeeld zo zijn dat een pointer naar een fundamenteel datatype (zoals void) er anders uitziet dan een pointer naar een klasse. Dan moet de een echt in de ander omgezet worden. Dit is niet alleen theoretisch, ik heb mensen gesproken die het probleem ook werkelijk in de praktijk zijn tegengekomen.

Een "memory adres is een memory adres" kan wel waar zijn, maar een X-pointer hoeft geen Y-pointer te zijn. ;)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115134269
quote:
0s.gif Op zondag 5 augustus 2012 12:59 schreef robin007bond het volgende:
Ik heb dit boek thuis nog liggen (van mijn pa):

http://www.bol.com/nl/p/basiscursus-c/666842990/

Basiscursus C++ van L. Ammeraal uit 1997. Is er in de loop der tijd veel veranderd? Zou ik dit boek nog kunnen gebruiken?
In 1998, 2003 en 2011 zijn er nieuwe 'versies' van C++ uitgekomen waarbij vooral dingen zijn toegevoegd. De basis is volgens mij niet zo sterk veranderd en daarom lijkt het me geen probleem om met zo'n boek te beginnen. (Ik ken het boek verder niet, dus dit is algemeen gesteld.)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115134304
quote:
0s.gif Op zondag 5 augustus 2012 13:17 schreef GS42 het volgende:

[..]

In 1998, 2003 en 2011 zijn er nieuwe 'versies' van C++ uitgekomen waarbij vooral dingen zijn toegevoegd. De basis is volgens mij niet zo sterk veranderd en daarom lijkt het me geen probleem om met zo'n boek te beginnen. (Ik ken het boek verder niet, dus dit is algemeen gesteld.)
Hmm, oké. Duidelijk.

Misschien dat ik beter een recent boek kan kopen. Ik zal wel even kijken.

Veel mensen raden ook aan eerst C te leren, omdat C++ een superset van C zou zijn. De OP zegt eigenlijk van niet en ik heb er ook mijn twijfels bij.
pi_115134498
quote:
Veel mensen raden ook aan eerst C te leren, omdat C++ een superset van C zou zijn. De OP zegt eigenlijk van niet en ik heb er ook mijn twijfels bij.
Wordt vaak gezegd maar is inderdaad niet helemaal waar. Er zijn dingen die in C legaal zijn maar in C++ niet mogen en er zijn zelfs dingen die in C een andere betekenis hebben dan in C++. Dat gezegd hebbende, er zijn wel erg veel overeenkomsten.

Je kunt prima C++ leren zonder C eerst gedaan te hebben. Je hoeft dan zelfs minder dingen af te leren en kan ook grote gedeeltes van C 'overslaan' omdat het in C++ anders (beter :P) kan. Dus het hoeft zeker niet. Wel is een goed boek belangrijk. Eerder in dit topic heb ik daar dacht ik al wat over geschreven, misschien dat dat je helpt.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115135408
Volgens mij is het met uitsluitend tutorials op internet ook wel goed te doen.
pi_115135534
quote:
0s.gif Op zondag 5 augustus 2012 13:48 schreef thenxero het volgende:
Volgens mij is het met uitsluitend tutorials op internet ook wel goed te doen.
Wat versta jij onder tutorial?

Een professor van mij heeft zelf een boek geschreven en deze staat ook gratis op internet
http://www.icce.rug.nl/documents/cplusplus/
pi_115135713
quote:
0s.gif Op zondag 5 augustus 2012 13:52 schreef t4rt4rus het volgende:

[..]

Wat versta jij onder tutorial?

Een professor van mij heeft zelf een boek geschreven en deze staat ook gratis op internet
http://www.icce.rug.nl/documents/cplusplus/
Ik bedoel gewoon dat je zo'n beetje alles wel op internet kan vinden, zoals je zelf ook al een beetje aangeeft. Bedankt voor die link trouwens :)
pi_115135850
quote:
0s.gif Op zondag 5 augustus 2012 13:56 schreef thenxero het volgende:

[..]

Ik bedoel gewoon dat je zo'n beetje alles wel op internet kan vinden, zoals je zelf ook al een beetje aangeeft. Bedankt voor die link trouwens :)
Hebben we niet echt veel aan.
Dan kan ik ook zeggen zo'n beetje alles wel op aarde te vinden is. :P
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')