Миф о мифе о бескомпромиссной эффективности STL-евых векторов.
Вынесено из комментов и причесано. Обе функции скомпилированы компилятором gcc-4.1.2 для архитектуры x86 на gentoo с флагом -O2. Из ассемблерного кода выкинуты пролог и эпилог, оставлены только циклы.
Это, конечно же, тривиально и не стоило бы упоминания, если бы не всплывало с завидным постоянством в самых разнообразных дискусиях.
| #include <vector> void z(int n, int k, std::vector<int>& a) { for (int i=0; i<n; i++) a[i%k] = i; } | void z (int n, int k, int* a) { for (int i=0; i<n; i++) a[i%k] = i; } |
| .L4: movl %edi, %eax cltd idivl %ebx movl %edi, (%ecx,%edx,4) incl %edi cmpl %edi, %esi jne .L4 | .L4: movl %ecx, %eax cltd idivl %ebx movl %ecx, (%esi,%edx,4) incl %ecx cmpl %ecx, %edi jne .L4 |
Это, конечно же, тривиально и не стоило бы упоминания, если бы не всплывало с завидным постоянством в самых разнообразных дискусиях.
