Versuchen Sie zu sehen, welche Besetzung schneller ist (nicht notwendig, besser): neue C++ - Fall oder alte Mode C-Stil zu werfen. Irgendwelche Ideen?welche Besetzung ist schneller static_cast <int>() oder int()
Antwort
Es sollte keinen Unterschied geben, wenn Sie int()
mit gleichwertige Funktionalität von static_cast<int>()
vergleichen.
Mit VC2008:
double d = 10.5;
013A13EE fld qword ptr [[email protected] (13A5840h)]
013A13F4 fstp qword ptr [d]
int x = int(d);
013A13F7 fld qword ptr [d]
013A13FA call @ILT+215(__ftol2_sse) (13A10DCh)
013A13FF mov dword ptr [x],eax
int y = static_cast<int>(d);
013A1402 fld qword ptr [d]
013A1405 call @ILT+215(__ftol2_sse) (13A10DCh)
013A140A mov dword ptr [y],eax
Offensichtlich ist es 100% die gleichen!
+1. Die Montage ist immer schön für solche Dinge. – Joey
Das sieht nicht sexy für mich aus :) Ein sexy würde SSE-Anweisungen verwenden, ohne die FPU überhaupt zu beteiligen :) (Ich dachte, dass SSE standardmäßig in VC verwendet wurde). – AnT
@AndreyT Es tut :) der Code in der Antwort wurde im Debugging-Modus erzeugt. Wenn Sie versuchen, es mit Optimierungen zu kompilieren, verwendet es SSE-Anweisungen. – AraK
Werfen Sie einen Blick auf die Baugruppe mit jeder Methode. Wenn es anders ist, benutze einen Profiler.
Sie sind die gleichen wie es während der Kompilierzeit selbst aufgelöst wird und es keinen Laufzeitaufwand gibt. Selbst wenn es einen Unterschied gäbe, würde ich mich nicht wirklich um diese winzigen (nicht einmal Mikro-) Optimierungen kümmern.
Kein Unterschied überhaupt.
Wenn es sich um solche grundlegenden Konstrukte wie eine einzige Besetzung handelt, werden zwei Konstrukte, wenn sie dieselbe semantische Bedeutung haben, vollkommen identisch sein, und der für diese Konstrukte generierte Maschinencode wird derselbe sein.
Wenn Sie aus der Wahl nur einen kleinen Unterschied machen, wähle ich den, der späterem Programmierer vertrauter erscheint. Es ist immer eine Überlegung wert, anderen Code leichter verständlich zu machen. In diesem Fall würde ich aus diesem Grund int(…)
bleiben.
Warum würden Sie annehmen, dass int (...) vertrauter ist? Es scheint tatsächlich in C nicht gültig zu sein, vielleicht eher ein Pseudo-Konstruktor-Aufruf von C++. - Warum sollte Code, wenn er nicht explizit über die Art der Besetzung spricht, den Code leichter verständlich machen? – UncleBens
Darsteller sind nichts zu spielen und sollten deshalb leicht zu erkennen sein. Das ist, was die C++ - Style-Casts sind. – foraidt
Ich glaube, dass das tatsächliche Ergebnis Implementierung definiert ist. Sie sollten es in Ihrer Version des Compilers überprüfen. Aber ich glaube, dass es das gleiche Ergebnis in den meisten modernen Compilern geben wird. Und in C++ sollten Sie nicht C-Cast verwenden, sondern stattdessen C++ casts verwenden - damit können Sie Fehler bei der Kompilierung finden.
+1 für die Erwähnung von Kompilierzeitprüfungen – foraidt
Leistungsprobleme sind nicht implementierungsdefiniert (der Standard schreibt keinerlei Leistung vor, mit Ausnahme von "big-O" für Containeroperationen) –
Da die meisten Leute sagen, man hofft, dass diese die gleiche Geschwindigkeit sein sollten, obwohl Sie Ihrem Compiler ausgeliefert sind ... und das ist nicht immer eine sehr glückliche Situation. Lesen Sie weiter für Kriegsgeschichten.
Abhängig von Ihrem Compiler und dem jeweiligen Modell des Prozessorkernes, die das Programm auf der Geschwindigkeit führt von float f; int i(f);
, float f; int i = (int)f;
und float f; int i = static_cast<int>(f);
und Konsorten (einschließlich Variationen beteiligt Doppel, lange und unsigned-Typen) kann atrociously langsam sein - ein Auftrag von Magnitude schlimmer als Sie erwarten. Der Compiler kann Anweisungen ausgeben, die die internen Prozessormodi verändern, wodurch Anweisungspipelines weggeworfen werden. Dies ist in der Tat ein Fehler im Optimierungselement des Compilers. Ich habe Fälle gesehen, in denen man unter den in this analysis erwähnten 40-Taktzyklus-Kosten leidet. An diesem Punkt gibt es einen großen, unerwarteten und irritierenden Leistungsengpass. Bei AFAIK gibt es keine ganz angenehme, robuste, generische Lösung. Es gibt Alternativen mit Assembler, aber mit AFAIK runden sie Fließkommazahlen nicht auf ganzzahlige Weise ab, wie es bei den Umwandlungen der Fall ist. Wenn jemand es besser weiß, bin ich interessiert. Ich hoffe, dieses Problem wird/wird in Kürze auf Legacy-Compiler/Hardware beschränkt sein, aber Sie brauchen Ihren Verstand über Sie.
P.S. Ich kann diesen Link nicht erreichen, weil meine Firewall es als spielbezogen blockiert, aber a Google cache of it ausreicht, um zu zeigen, dass der Autor mehr darüber weiß als ich.
- 1. Rundung mit static_cast <int>?
- 2. Welcher Boolean ist schneller? <oder <=
- 3. Welche ist schneller, equalsIgnoreCase oder compareToIgnoreCase
- 4. Welche ist schneller: korrelierte Unterabfragen oder Join?
- 5. C# Was ist schneller: SerialPort.Write (byte [], int, int) oder SerialPort.BaseStream.WriteByte()?
- 6. SFINAE: 'static_cast <void>()' oder ', void()'?
- 7. Welche Regexp ist schneller
- 8. Ist static_cast <T> (...) Kompilierzeit oder Laufzeit?
- 9. Was ist schneller (x <0) oder (x == -1)?
- 10. Gibt es eine Alternative zur Verwendung von static_cast <int> die ganze Zeit?
- 11. Was ist schneller: SqlCommand.Parameters [Zeichenfolge] oder .Parameters [Int]?
- 12. Ist HttpWebRequest oder Webclient schneller
- 13. Warum ist float() schneller als int()?
- 14. unique_ptr <int[]> oder Vektor <int>?
- 15. Welche ist schneller/besser für Caching, Dateisystem oder Memcached?
- 16. Logging in innoDB Tabelle oder lokale Datei, welche ist schneller?
- 17. Mongodb was ist schneller $ in oder $ oder?
- 18. Wie static_cast zwischen Verweisen auf Int und Bereichsaufzählung?
- 19. Warum Vektor <int> ist schneller als Vektor <bool> im folgenden Fall
- 20. Ist es schneller die Liste <T> .Remove (T) oder Liste <T> .RemoveAt (int) -Methode?
- 21. Regex gegen manuellen Vergleich. Welche ist schneller?
- 22. Systemaufruf oder dlsym? Welcher Weg ist schneller?
- 23. Was ist schneller, Zeigerzugriff oder Referenzzugriff?
- 24. Static_cast Integer-Adresse zum Zeiger
- 25. Was ist schneller/effizienter: Dictionary <string, object> oder Dictionary <enum,object>?
- 26. In Mysql-Datenbank-Tabelle, die Suche schneller (String oder Int)
- 27. Welches ist bevorzugt: neue Nullable <int> oder (int?) Null?
- 28. numpy.max oder max? Welcher ist schneller?
- 29. statische Besetzung auf einer Referenz
- 30. Wer ist schneller: BOOST_FOREACH Makros oder für
könnten Sie immer ein Benchmark-Skript schreiben. Mach einfach 10 Millionen Static_cast und 10 Millionen Int Cast, und schau, welche länger dauert. my * rate * ist, dass sie zu derselben Assembleranweisung kompilieren werden. – Kip
Ungeachtet der Tatsache, dass sie fast sicher auf allen Compilern das gleiche kompilieren, warum sollte das wichtig sein? Sofern Sie keine Leistungsprobleme haben, schreiben Sie, um klar zu sein und schwer zu lesende Mikrooptimierungen zu vermeiden, die ohnehin wahrscheinlich sinnlos sind. Verwenden Sie static_cast(). –
C-Style-Casts werden in C++ - Style-Casts definiert (und c-Style-Casts können an private Basen übertragen werden ...). Sie sind also ziemlich gleichwertig. niemand hat einen Leistungsschub gegenüber dem anderen. –