int i = 10 vs int i(10)
-
wie wandel ich den C++ code in assembler um mit VS 2008?
-
Erhard Henkes schrieb:
Macht doch einfach beide Varianten und schaut euch diese auf Assembler-Ebene mit verschiedenen Optimierunsflags an. Dann wisst ihr es genau.
Hmm.
int i = 2 ist gleichbeduetend mit int i (2), respektive wird in genau das gleiche umgewandelt, aber ich denke mal,dass du auf das raus wolltest.
@initialisierung:
Schau dir doch mal im Debuger den generierten Code an. (ev. auf Releas stellen).
-
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)So ein Schwachsinn. Seit wann ist int den ein Objekt mit Konstruktor?
Das mit dem Assemblercode ist garnicht so einfach, weil der Compiler euch ganz was anderes erzeugen wird, als ihr erwartet und das meiste wird er gleich weg optimieren. Aber viel Spaß bei der Suche nach dem Assemblercode des Defaultconstruktoraufrufes von int. :p
-
wenn ich auf debugging starten gehe dann öffnet sich das programm dann schließe ich es wieder mehr passiert nicht
-
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.
-
ganz einfach schrieb:
So ein Schwachsinn. Seit wann ist int den ein Objekt mit Konstruktor?
Seit C++
Sonnst würde die Initialisierung mit Klammern (quasi über den Konstruktor) überhaupt nicht gehen.
-
int i = 10;ist äquivalent zuint i(10);. Selbst wenn int eine Klasse oä wäre, würde hier _nicht_ der Zuweisungsoperator benutzt. Ersteres wäre vielmehr eine implizite Umwandlung. Bei Interesse sei hier auch auf das Schlüsselwort explicit hingewiesen, um solche impliziten Umwandlungen zu unterbinden.
-
Chewbaka schrieb:
ganz einfach schrieb:
So ein Schwachsinn. Seit wann ist int den ein Objekt mit Konstruktor?
Seit C++
Sonnst würde die Initialisierung mit Klammern (quasi über den Konstruktor) überhaupt nicht gehen.Nein, int ist keine Klasse und hat auch keinen Konstruktor. int ist ein POD-Typ. Das man int (und die anderen builtin-Typen) dennoch so initialisieren kann, wie mit einem Konstruktor, ist eine extra hinzugefügte Ausnahme, damit man besser generisch programmieren kann.
-
der Master hat gesprochen

danke
-
Yep! Der Assemblercode ist ebenfalls identisch.
Nochmals zum Schlüsselwort explicit:
http://www.henkessoft.de/C++/Cpp_school/explicit.html
-
..
-
Erhard Henkes schrieb:
Bjarne Stroustrup
Interessantes Mitglied.
http://www.henkessoft.de/C++/Cpp_school/stroustrup.jpgDas wär ja mal richtig geil, wenn der hier aufkreuzen würde.. xD
btw:
Warum hast du ein Bild von Bjarne auf deiner Homepage? (Ok, ich gebs zu, i hab eins unter dem Kopfkissen. :p )
-
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