Ein std::vector hat einen minimalen Mehraufwand bei dem Zugriff auf ein Element.
Moment, wieso? Klar, im Debugbuild sind alle Range-Checks drin, aber im Releasemode sollte der Elementzugriff über den [] genauso schnell wie bei jedem Array sein. Die Mehrkosten sind eher auf der Speicherseite, wo neben ein paar Zusatzinfos insbesondere noch Speicher für zukünftige Elemente schonmal reserviert ist.
Bei statischen Arrays weiss der Compiler bereits wo der Speicher ist (das offset muss natürlich noch berechnet werden) und daher muss nicht zuerst noch die Adresse geladen werden.
Pseudo Assembler (irgendwelche misch-masch Syntax
):
Statischer Zugriff:
|
Quellcode
|
1
|
mov %eax, (DIREKTE_ADRESSE)
|
Dynamischer Zugriff:
|
Quellcode
|
1
2
|
mov %ebx, (%ecx)
mov %eax, (%ebx)
|
Im ersten Beispiel kann die Adresse direkt berechnet werden. Das offset kann auch direkt beim lade Befehl mitgebeben werden (üblicherweise).
Im zweiten Beispiel muss zuerst die Adresse des Zeigers aus der Variable, auf welche mit ecx zugegriffen werden kann (in dem Beispiel). Diese Adresse ist dann das eigentliche Ziel und wird benutzt um den eigentlichen Wert in eax zu laden.
Das teure hier ist das laden vom Speicher, welcher auf RAM zugreifen muss. Die Berechnung der Offsets ist praktisch gratis (irgendwo bei 1-4 Cycles, während der Speicherzugriff IIRC ein paar hundert kosten kann).