madwizard schreef op 27 February 2003 @ 17:19:
Bij mijn weten gaat VC nooit zelf inlinen als een functie niet inline is, tenzij je /Ob2 gebruikt en die staat standaard uit. gcc begon alles inline te maken en dat wilde ik juist niet omdat de test dan niet goed ging. De foo functie moest juist helemaal losstaan.
gcc gaat ook "nooit zelf inlinen als een functie niet inline is", tenzij je -O2 (optimalisatie level 2, AKA /O2 voor VC)
Die heb ik niet gebruikt. Standaard staat ie op 4 dacht ik, volgens mij zorgt die er dan alleen maar voor dat de stack aligned blijft op 32-bit boundaries, maar wat in dat stukje code gebeurd heeft daar niet veel mee te maken volgens mij. Alignment is inderdaad goed voor data access maar aangezien hier het enige stack gebruik de 2 pushes en het gebruik van de parameters is hoeft er niks extra's te gebeuren om de stack aligned te houden (op 4 bytes is ie altijd al aligned in windows). Die adds en subs in dit stukje code vertragen het alleen maar.
Misschien heb je wel dan een "-march=..." gebruikt, die zet ook deze optimalisatie.
Dit was ook geen project van me ofzo, het moet juist geen debug versie zijn. Het ging me er alleen om uit te vinden of de compiler checkt op null references. Alleen wilde ik zoveel mogelijk optimalisaties aan en debug dingen uit, visual C voegt ook een hoop extra checks (bijvoorbeeld voor de stack pointer) uit in de debug build.
In gcc heb ik dat maar geprobeerd met wat opties die ik zag staan, ik ken visual C veel beter dus daar weet ik precies wat ik wel en niet moet aanzetten. Ben wel benieuwd wat gcc ervan maakt met de 'goede' instellingen. Die xor edx, edx bijvoorbeeld is me nog steeds een raadsel en dat gedoe met esp ziet er toch ook niet echt uit als optimalisatie.
Als je met VStudio een debug build maakt, worden er ook geen dingen gedaan als "-fomit-frame-pointer" en -O2 e.d. Dan wordt het geheel ook zo clean mogelijk gecompileert, zonder teveel poespas. Wat ik niet helemaal snap is dat je met VC wel een debug build doet, maar met gcc niet

Wat is de logica daar achter?
Maar ik vind ook dat gcc best had kunnen kiezen om "a" in edx te zetten, deze op nul te checken, en dan een conditionele move met [edx + 4] naar edx, dan had edx niet nog eens nul gemaakt hoeven worden. En de logica achter die esp += 0x18 snap ik ook niet, ik snap esp += 8. (al is al het alignen in veel gevallen helemaal niet nodig...)
Maar gcc doet wel meer rare dingen, zoals een for loop in een while met dezelfde conditie, daar wordt vaak ook twee keer hetzelfde getest voor een conditionele jump naar hetzelfde