In C++ aber nicht wirklich, und da erlaubt es VS auch.VS unterstützt wohl void weil das in C soweit auch ok ist.
Ach, wenn es nur so wäre.Siehe "or in some other implementation-defined manner."
VS behandelt void halt eben nicht als void. Ich deute es eher als Versuch seitens MS, die Logik auf C-Ebene wieder geradezubiegen: "Was, eine int-Funktion ohne Rückgabewert? Das darf nicht sein. Nennen wir es void und setzen EAX einfach selbst auf 0". Denn void heisst für Sprachen höher als ASM schlicht: "Ich habe dir nichts zu geben". In ASM heisst es hingegen: "Ich tue nichts mit dem EAX-Register".
Stimmt. Dennoch gibt es einen Grund, weshalb einige Funktionen noch von Hand gemacht werden (z.B. memcpy, strcpy etc.). Natürlich ist das mischen dieser beiden Codes zwischen Funktionen brandgefährlich, manchmal ist inline ASM aber dennoch Gold wert.Die meisten der Mikrooptimierungen, die sich auf ASM-Code berufen funktionieren meistens nur im Debugmodus, im Releasemodus funkt dir der Optimierer in Echtweltsituationen viel zu stark dazwischen. Die Signatur einer Funktion sollte nicht durch Optimierungen bestimmt werden sondern durch die durch die Architektur gegebenen Kriterien.
Ich würde mir die Optimierungen zwar gerne ansehen, aber VS erlaubt die Breakpoints ein bisschen wenig
Wobei der Optimierer auch nicht wirklich zu C selbst gehört; es ist schlicht eine nette Dreingabe. Wobei die Optimierer meist ein Buch mit sieben Siegeln sind :/
Gruss
cwriter
/EDIT: Antwort an sheel zur Vermeidung des Doppelposts
DitoMuss gerade wieder an unsere PN-Unterhaltung wegen VS denken
Hm? Es ist die Hauptfunktion, der Rumpf sozusagen, und wird immer ausgeführt. Was ist sonst noch anders?Naja, main ist ja auch so, ohne Asm, nicht exakt wie andere Funktionen.
Ein Beispiel wäre z.B. die Wiedernutzung in einer DLL oder einer LIB. Beispielsweise, wenn die main das Interface initialisiert, ist dies nicht mal unwahrscheinlich. Oder ein Server, der früher in der main gestartet wurde und nun direkt, so wie er ist, eingebunden werden soll.Warum sollte es also 100% gleich behandelt werden?
Wobei g++ bei C++11 hinterherhinkt. Stichwort "-std=c++11". Ich glaube nicht, dass auf der Welt auch nur ein Standard existiert, an den sich alle halten.Andererseits schaffen sie es ja nicht einmal, C99 endlich voll zu unterstützen. Immerhin wird daran gearbeitet, 16 Jahre später...
Es geht mir um eine unnötige Inkonsistenz. Man spart, wie gesagt, fast nichts, wenn man das "return 0" weglässt. Dafür hat man damit grosse Probleme, wenn die Programme ein bisschen komplexer werden. Man nimmt mit dem Weglassen einer kurzen Zeile somit einige weitere Instruktionen in Kauf, die schlicht nicht sein müssten. Dieses Problem hat nicht nur VS, sondern wohl jeder Compiler (ich habe gerade kein Linux mit entsprechenden Tools zur Hand, vielleicht kann ja jemand die Codes oben durch gcc oder g++ jagen und die Ergebnisse anschauen). Es würde mich doch sehr erstaunen, würden die Ergebnisse massiv abweichen.Mir ist leider noch nicht ganz klar worauf die hinauswillst :/
Es gibt aber auch keinen Grund, EAX zu verändern. Eher im Gegenteil: Wozu unnötige Instruktionen ausführen? Dann ist EAX halt mal undefined. Es besteht kein Risiko, da EAX eines der volatilsten Register ist, und man davon eigentlich nur direkt nach einem Schreibvorgang lesen sollte. void war schon immer nur als Platzhalter gedacht. Aber wie gesagt: Man sollte es nicht tun, und wenn, dann sicher ohne Optimierer.Ob EAX bei void in Ruhe gelassen wird hängt auch sehr vom Compiler ab, garantiert ist es nicht.
Das würde ich nicht so sehen. C ist stark abhängig von ASM, aber nicht von der Hardware. Es ist schlicht mehr oder weniger portabler Code, der für viele Systeme gleich funktioniert, aber die Compiler machen daraus dennoch ASM. Daher: Was in ASM nicht möglich ist, geht auch nicht in C. Oder, mit einer berühmt-berüchtigten Auto-Analogie: Wenn der ungepolstere Rohbau es nicht den Berg hinauf schafft, dann schafft es derselbe Wagen mit Ledersitzen auch (oder gar "erst recht") nicht.Zu Lehre 3: Dass Asm im C-Standard als nicht-existent betrachtet wird (so wie Computer usw., wenn ich mich richtig erinnere), dürfte einer der Gründe für die weite Verbreitung sein = Dass es eben sehr wenig Vorgaben an Gerät und Umgebung macht und damit so ziemlich überall einsatzfähig ist.
Das sicherlich(aber auf jeden Fall ist es eine schöne Beschäftigung, auf der Ebene herumzuspielen )
Gruss
cwriter
Zuletzt bearbeitet: