Ich schreibe eine ziemlich komplexe Anwendung, die STL-Container stark nutzt. Die Anwendung verfügt über einen einzelnen, relativ einfachen, leistungsabhängigen Abschnitt, der über mehrere std::map
s iteriert und tausende Male ausgeführt wird. Tests haben gezeigt, dass das Kompilieren mit aktivierten Iteratoren deaktiviert ist ( _SECURE_SCL
auf 0 gesetzt), was zu einer fast zweifachen Beschleunigung des gesamten Programms führt.
Allerdings kann ich die Anwendung nicht kompilieren, wenn _SECURE_SCL
auf 0 gesetzt ist, weil die Verknüpfung mit Bibliotheken, die mit _SECURE_SCL
enabled kompiliert wurden, und das Mischen von _SECURE_SCL
Einstellungen zu Problemen führt. Außerdem finde ich es ziemlich albern, ungeprüfte Iteratoren in der gesamten Anwendung zu verwenden, wenn alle leistungsempfindlichen Bits in einem einzigen Bildschirm voller Code vorkommen. Das wäre gleichbedeutend damit, das Baby mit dem Bade auszuschütten.
Welche Optionen habe ich, um nichtüberprüfte Iteratoren für leistungssensitiven Code / Container selektiv zu verwenden und gleichzeitig die Kompatibilität mit Bibliotheken beizubehalten, die mit geprüften Iteratoren kompiliert wurden?
Wie Sie bereits herausgefunden haben, können Sie keinen Code mischen, der überprüfte / ungeprüfte Iteratoren verwendet. Um ihn also in einem Teil Ihres Codes zu verwenden, müssen Sie diesem Teil eine Schnittstelle geben, die keine Container übergeben muss und Iteratoren. (Beachten Sie, dass sich dies auf std::string
erstreckt.)
Und natürlich müssen Sie diesen Code in eine eigene ausführbare Datei (DLL) einfügen. Dies erfordert natürlich, dass nicht zu viele Aufrufe über diese API hin- und hergehen.
Um auf der sicheren Seite zu sein, würde ich sogar in Erwägung ziehen, diesen Teil in eine DLL mit einer C-Schnittstelle einzubauen.
Tags und Links c++ visual-studio-2008 stl performance iterator