Предположим, у нас есть класс Matrix в F #, и вы перегружаете оператор (+).Тогда у нас будет что-то вроде этого:
type Matrix(n : int, m : int) =
...
static member (+) (A : Matrix, B : Matrix) =
let res = new Matrix(A.Dim1, A.Dim2) // suppose A and B have the same dimension
... // compute here the sum
res
По сравнению с C / C ++ у нас будет что-то вроде этого:
static const Matrix operator+(const Matrix& A, const Matrix& B)
{
Matrix res(A.Dim1(), A.Dim2());
... // compute here the sum
return res;
}
Теперь обратите внимание, что в F # матрица res
выделяется в куче памяти , в отличие от версии C ++, которая выделяет res
в памяти стека .
Пока все хорошо.Обратите внимание, что происходит, когда мы хотим, чтобы « ссылка » на результат операции суммирования в обеих версиях:
Matrix result = A + B; // deep copy in C++ (because res has to be destroyed after its return)
let result = A + B // shallow copy in F# (res was allocated in the heap memory)
Я что-то здесь упустил или оператор (+) в F # заканчиваетсябыть более эффективным, чем его аналог в C / C ++, из-за мелкого и глубокого копирования?