Передача по значению, если тип меньше или сопоставим с указателем; например, int, char, double, маленькие структуры, ...
Передача по ссылке для более крупных объектов; например, контейнеры STL. Я много читал о том, что компиляторы могут оптимизировать его, но в моем простом тесте они этого не сделали. Если вы не хотите тратить время на тестирование сценариев использования, используйте const T& obj
.
Бонус: для более быстрой скорости используйте restrict
от c99 (таким образом, вы догоняете фортран, который ограничивает наложение указателей; прецедент: f(const T&__restrict__ obj)
. Стандарт C ++ не допускает ключевое слово restrict
, но компиляторы используют внутренние ключевые слова - g ++ использует __restrict__
. Если в коде нет псевдонимов, увеличение скорости не происходит.
бенчмарк с g ++ 4.9.2:
Вектор прохождения по ссылке:
> 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
Передача вектора по значению занимает в два раза больше времени:
> 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