a + b |
operator+(a, b) |
The reason is very simple: the computer does not know how to manipulate informations in a user-defined classes
class Matrix3
{
public:
float A[3][3];
};
|
int main(int argc, char *argv[])
{
Matrix3 M1, M2, M3;
M3 = M1 * M2; // Matrix multiplication !!!
};
|
M1 * M2 |
operator*(M1, M2) |
Matrix3 operator*(Matrix3 M1, Matrix3 M2)
{
Matrix3 r;
int i, j, k;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
r.A[i][j] = 0;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
for (k = 0; k < 3; k=k+1)
r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j];
return r;
}
|
Matrix3 operator*(Matrix3 M1, Matrix3 M2)
{
Matrix3 r;
int i, j, k;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
r.A[i][j] = 0;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
for (k = 0; k < 3; k=k+1)
r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j];
return r;
}
|
By value... in other words: by making a copy of the entire variable (in this case, copying 9 float variables)
But in every case, you have weight the benefit and the cost of safety through passing by value.
Matrix3 operator*(Matrix3 & M1, Matrix3 & M2)
{
Matrix3 r;
int i, j, k;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
r.A[i][j] = 0;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
for (k = 0; k < 3; k=k+1)
r.A[i][j] = r.A[i][j] + M1.A[i][k]*M2.A[k][j];
return r;
}
|
CC -o operator03 -fast operator03.C CC -o operator04 -fast operator04.C
time operator03 time operator04
class Matrix3
{
public:
float A[3][3];
};
|
class Vector3
{
public:
float x[3];
};
|
Matrix3 M; Vector3 v1, v2; v2 = M * v1; // Matrix3 * Vector3 |
Vector3 operator*(Matrix3 & M, Vector3 & v)
{
Vector3 z;
int i, j;
for (i = 0; i < 3; i=i+1)
z.x[i] = 0;
for (i = 0; i < 3; i=i+1)
for (j = 0; j < 3; j=j+1)
z.x[i] = z.x[i] + M.A[i][j]*v.x[j];
return z;
}
|