Voor built-in types kan je het beste by value passen. Hoewel een compiler het vaak wel optimaliseert als je een const reference gebruikt...maar niets is zeker. Je kan dit in het algemene geval bereiken door een type traits template class te maken, met een member typedef 'reference'. Die specialize je dan voor built-in types om by value te gaan:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| template <typename T>
struct Type_Traits {
typedef const T& reference;
};
template <>
struct Type_Traits<int> {
typedef int reference;
};
template <typename T>
typename Type_Traits<T>::reference foo(typename Type_Traits<T>::reference x) {
// ... do stuff
return T(x);
} |
Boost en andere libraries definieren dit soort traits classes al voor je, en ook nog veel beter en uitgebreider. Dit was maar een voorbeeld, waar ongetwijfeld dingen mis aan zijn in bepaalde situaties.
(Het 'waarom' is misschien belangrijker voor je... by-value wordt het object in kwestie gekopieerd, en by-reference wordt er alleen een pointer gekopieerd. Het kopieeren van een zwaar/groot object kost meestal veel tijd; het kopieeren van een pointer kan meestal in een cpu register, en kost zo goed als geen tijd. Aan de andere kant het 'dereferencen' van een pointer, dus zijn(haar?) waarde opvragen kost meer tijd dan voor een kopie. Hoewel dat ook meevalt, maar voor bv. integers wordt de totale tijd van de operatie verveelvoudigd. Bij zware objecten weegt het niet op tegen de tijd dat kopieeren zou kosten. Vandaar dat als iets in een cpu register past, je het beste by-value kan passen, en anders by-(const)reference.)
[
Voor 33% gewijzigd door
Zoijar op 22-06-2005 12:15
]