Archive for Janeiro 2009
Comparação de desempenho: std::vector vs Array
Comparação entre os códigos assembly gerados para operações de indexação básica, dereferenciação eincremento em std::vectors e arrays/ponteiros.
O código assembly foi gerado pelo gcc 4.1.0 chamado com g++ -03 -S em uma máquina x86_64-suse-linux.
#include
struct S
{
int padding;
std::vector v< int >; //nosso vector
int * p; //nosso ponteiro
std::vector< int >::iterator i; //iterador do vector
};
int indexar_ponteiro(S & s) { return s.p[3]; }
// movq 32(%rdi), %rax
// movl 12(%rax), %eax
// ret
int indexar_vector(S & s) { return s.v[3]; }
// movq 8(%rdi), %rax
// movl 12(%rax), %eax
// ret
// Conclusão: Indexar um std::vector é a mesma coisa de indexar um ponteiro.
int deref_ponteiro(S & s) { return *s.p; }
// movq 32(%rdi), %rax
// movl (%rax), %eax
// ret
int deref_iterador(S & s) { return *s.i; }
// movq 40(%rdi), %rax
// movl (%rax), %eax
// ret
// Conclusão: Dereferenciar um std::vector é a mesma coisa de dereferenciar um ponteiro.
void incrementar_ponteiro(S & s) { ++s.p; }
// addq $4, 32(%rdi)
// ret
void incrementar_iterador(S & s) { ++s.i; }
// addq $4, 40(%rdi)
// ret
// Conclusão: Incrementar um iterador de std::vector é a mesma coisa de incrementar um ponteiro.
Ou seja, além das facilidades do std::vector, algumas operações básicas tem o mesmo custo tanto com std::vector quanto um array/ponteiro.
Surpreso?