int i = 10 vs int i(10)
-
nochmals meine frage
wie wandelt man C++ in assembler code um?
-
wie wandelt man C++ in assembler code um?
Das ist eine wesentliche Aufgabe des Compilers/Linkers aus den h/cpp/lib-Dateien ausführbaren Maschinencode zu erzeugen. Mittels Disassemblierung erhält man dann Assemblercode. VC++ und gcc kann dies zum Beispiel.
Beispiel:
http://archives.free.net.ph/message/20080704.095504.784c20e1.de.html#gcc-helpIn VC++ kannst Du dies mit Alt+F7 einstellen:
C/C++ Ausgabedateien -> Assemblyausgabe:
Assembly, Computercode und Quelle (/FAcs)
-
wie mache ich das mit Vs 2008
-
..
-
..
-
folgender code wird in den unteren asm code umgewandelt
anscheinend ist immer erst der C++ ausdruck und dann umgewandelt in assembler
warum ist int i = 10; nicht in assembler umgewandelt?#include <iostream> int main() { int i = 10; std::cout << i << std::endl; system("PAUSE"); return 0; }#include <iostream> int main() { int i = 10; std::cout << i << std::endl; 00401000 mov eax,dword ptr [__imp_std::endl (402040h)] 00401005 mov ecx,dword ptr [__imp_std::cout (402044h)] 0040100B push eax 0040100C push 0Ah 0040100E call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (40203Ch)] 00401014 mov ecx,eax 00401016 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402038h)] system("PAUSE"); 0040101C push offset string "PAUSE" (402114h) 00401021 call dword ptr [__imp__system (4020B4h)] 00401027 add esp,4 return 0; 0040102A xor eax,eax } 0040102C ret
-
(Die Disassembly kann nicht im Ausführmodus angezeigt werden.)
kommt bei mir wenn ich auf debugging starten gehe und dann das anzeigen lasse
( das oben war mit einzelschritten)
-
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=2318&lngWId=3
http://www.it-academy.cc/article/889/InlineAssembler(x86)+in+C+C++.html
-
initialisierung schrieb:
warum ist int i = 10; nicht in assembler umgewandelt?
weil es wegoptimiert wurde:
0040100C push 0Ahda ist noch halb sichtbar
-
Shade Of Mine schrieb:
initialisierung schrieb:
warum ist int i = 10; nicht in assembler umgewandelt?
weil es wegoptimiert wurde:
Sogar der Defaultkonstruktor
:pWenn du ne Funktion schreibst in der etwas mehr mit i gerechnet wird, dann wird das int i = 10 wahrscheinlich zu mov eax 10 oder ein anderes Register. Vielleicht findet ja dann einer den Defaultkonstruktoraufruf für das Register.

-
..
-
Bjarne Stroustrup schrieb:
Chewbaka schrieb:
Naja,soviel ich weiss entspricht
int i = 10; //Dem hier: int i; // mit defaultkonstruktor i.operator=(10); // zuweisungsoperator (und zwar ein automatisch generierter)Von daher ist es schon etwas langsamer als
int i(10); // konstruktor mit initialisierung /* i(int val) : i(val) {} */Oder so ähnlich wirds wohl ausschauen intern.
Thats undoubtly correct, but modern compilers optimize this assignment straight away! Therefore it doesn't matter in practise too much.
Hi Börni !