Se ti interessa l'efficienza, i template uniti alle ottimizzazioni del compilatore possono fare miracoli..
Per curiosità ho scritto questo codice di prova
codice:
#include <iostream>
template <class type, unsigned int ndim> class vec
{
public:
type data[ndim];
vec<type, ndim> operator + (vec<type, ndim> v)
{
vec<type, ndim> r;
for (unsigned int i = 0; i < ndim; i++)
r.data[i] = data[i] + v.data[i];
return r;
}
};
template <class type, unsigned int ndim> __declspec(noinline)
std::ostream & operator << (std::ostream &stream, vec<type, ndim> &v)
{
for (unsigned int i = 0; i < ndim; i++)
stream << v.data[i] << ' ';
return stream;
}
template <class type, unsigned int ndim> __declspec(noinline)
std::istream & operator >> (std::istream &stream,vec<type, ndim> &v)
{
for (unsigned int i = 0; i < ndim; i++)
stream >> v.data[i];
return stream;
}
int main ()
{
const unsigned int ndim = 6;
vec<double, ndim> a;
vec<double, ndim> b;
std::cin >> a >> b;
vec<double, ndim> c = a + b;
std::cout << c;
return 0;
}
E' sorprendente come il compilatore riesca a ottimizzare.. questo è l'assembly prodotto
codice:
const unsigned int ndim = 6;
vec<double, ndim> a;
vec<double, ndim> b;
std::cin >> a >> b;
0094101B mov ebx,dword ptr [__imp_std::cin (942064h)]
00941021 push edi
00941022 lea eax,[esp+8]
00941026 call operator>><double,6> (941150h)
0094102B mov ebx,eax
0094102D lea eax,[esp+38h]
00941031 call operator>><double,6> (941150h)
vec<double, ndim> c = a + b;
00941036 fld qword ptr [esp+8]
0094103A fadd qword ptr [esp+38h]
std::cout << c;
0094103E mov edi,dword ptr [__imp_std::cout (942058h)]
00941044 lea ebx,[esp+68h]
00941048 fstp qword ptr [esp+68h]
0094104C fld qword ptr [esp+10h]
00941050 fadd qword ptr [esp+40h]
00941054 fstp qword ptr [esp+70h]
00941058 fld qword ptr [esp+48h]
0094105C fadd qword ptr [esp+18h]
00941060 fstp qword ptr [esp+78h]
00941064 fld qword ptr [esp+50h]
00941068 fadd qword ptr [esp+20h]
0094106C fstp qword ptr [esp+80h]
00941073 fld qword ptr [esp+58h]
00941077 fadd qword ptr [esp+28h]
0094107B fstp qword ptr [esp+88h]
00941082 fld qword ptr [esp+60h]
00941086 fadd qword ptr [esp+30h]
0094108A fstp qword ptr [esp+90h]
00941091 call operator<<<double,6> (941180h)
return 0;
}
Non genera nessuna copia, nessun oggetto.. "srotola" perfino il ciclo
Usando un std::vector probabilmente l'overhead supera anche il 200% del lavoro che dovrebbe fare. Ma questo ovviamente dipende dalle tue necessità