passe par la valeur si le type est inférieur ou comparable à un pointeur; par exemple, int, char, double, small structs, ...
Passage par référence pour les objets plus grands; par exemple, les conteneurs STL. J'ai lu beaucoup de choses sur les compilateurs capables de l'optimiser mais ils ne l'ont pas fait à mon simple benchmark qui suit. Sauf si vous voulez perdre du temps à tester des cas d'utilisation, utilisez const T& obj
.
Bonus: Pour une utilisation plus rapide vitesse restrict
de C99 (cette façon, vous rattrapez Fortran, ce qui limite l'aliasing pointeur, cas d'utilisation. f(const T&__restrict__ obj)
C++ standard ne permet pas mot-clé restrict
mais les compilateurs utilisent des mots clés internes - g ++ utilise __restrict__
. S'il n'y a pas aliasing dans le code, il n'y a pas de gain de vitesse
la référence avec g ++ 4.9.2.
passage vecteur par référence:
> cat inpoint.cpp
#include <vector>
#include <iostream>
using namespace std;
inline int show_size(const vector<int> &v) {
return v.size();
}
int main(){
vector<int> v(100000000);
cout << show_size(v) << endl;
return 0;
}
> g++ -std=c++14 -O2 inpoint.cpp; time ./a.out
100000000
real 0m0.330s
user 0m0.072s
sys 0m0.256s
Passant vecteur par la valeur prend deux fois plus de temps:
> cat invalue.cpp
#include <vector>
#include <iostream>
using namespace std;
inline int show_size(vector<int> v) {
return v.size();
}
int main(){
vector<int> v(100000000);
cout << show_size(v) << endl;
return 0;
}
> g++ -std=c++14 -O2 invalue.cpp; time ./a.out
100000000
real 0m0.985s
user 0m0.204s
sys 0m0.776s
La meilleure chose à faire ici est de l'essayer.Je doute que le compilateur fasse quelque chose (apparemment) stupide, mais je peux me tromper. – Noldorin
Le compilateur fera le travail requis. Si une copie est nécessaire (si i est modifié dans la fonction) alors une copie sera faite. S'il n'a pas besoin de copier la valeur, ce ne sera pas le cas. Quoi qu'il arrive si je suis manipulé de toute façon (comme dans une expression), il sera probablement copié dans un registre de toute façon. –