Präambel für Mikrooptimierer
Merken:
"Programmierer verschwenden enorm viel Zeit damit, über die Geschwindigkeit unkritischer Teile ihrer Programme nachzudenken oder sich darüber Gedanken zu machen, und diese Effizienzversuche wirken sich tatsächlich stark negativ aus, wenn Debugging und Wartung in Betracht gezogen werden. Wir sollten beispielsweise kleine Effizienzvorteile vergessen." 97% der Zeit: Vorzeitige Optimierung ist die Wurzel allen Übels. Dennoch sollten wir unsere Chancen in diesen kritischen 3% nicht verpassen. "
(Dank Metamorphose für das vollständige Zitat)
Verwenden Sie kein C-Array anstelle eines Vektors (oder was auch immer), nur weil Sie glauben, dass es schneller ist, da es niedriger sein soll. Du würdest dich irren.
Verwenden Sie standardmäßig den Vektor (oder den an Ihre Anforderungen angepassten sicheren Container). Wenn Ihr Profiler ein Problem angibt, prüfen Sie, ob Sie ihn optimieren können, indem Sie entweder einen besseren Algorithmus verwenden oder den Container ändern.
Dies heißt, wir können zur ursprünglichen Frage zurückkehren.
Statisches / dynamisches Array?
Die C ++ - Array-Klassen verhalten sich besser als das C-Array auf niedriger Ebene, da sie viel über sich selbst wissen und Fragen beantworten können, die C-Arrays nicht beantworten können. Sie können nach sich selbst putzen. Und was noch wichtiger ist: Sie werden normalerweise mithilfe von Vorlagen und / oder Inlining geschrieben. Dies bedeutet, dass das, was beim Debuggen von viel Code erscheint, in wenig oder gar keinen Code aufgelöst wird, der im Release-Build erstellt wurde, was keinen Unterschied zu ihrer integrierten, weniger sicheren Konkurrenz bedeutet.
Alles in allem fällt es in zwei Kategorien:
Dynamische Arrays
Die Verwendung eines Zeigers auf ein malloc-ed / new-ed-Array ist bestenfalls so schnell wie die std :: vector-Version und viel weniger sicher (siehe Litbs Beitrag ).
Verwenden Sie also einen std :: vector.
Statische Arrays
Die Verwendung eines statischen Arrays ist bestenfalls:
- so schnell wie die std :: array version
- und viel weniger sicher.
Verwenden Sie also ein std :: array .
Nicht initialisierter Speicher
Manchmal verursacht die Verwendung eines vector
anstelle eines Rohpuffers sichtbare Kosten, da der vector
Puffer bei der Erstellung initialisiert wird, während der Code, den er ersetzt, dies nicht tat, wie bernie in seiner Antwort bemerkte .
Wenn dies der Fall ist, können Sie damit umgehen, indem Sie ein unique_ptr
anstelle von a verwenden vector
oder, wenn der Fall in Ihrer Codeline nicht außergewöhnlich ist, tatsächlich eine Klasse schreiben buffer_owner
, die diesen Speicher besitzt, und Ihnen einen einfachen und sicheren Zugriff darauf gewähren, einschließlich Boni wie Größenänderung (mit realloc
?) oder was auch immer Sie brauchen.