В C++03 была проблема ненужных копий, которые могли происходить неявно. Для этого в C++11 были введены rvalue references
и move semantics
. Теперь мой вопрос в том, существует ли эта проблема ненужного копирования также в таких языках, как C# и java, или это проблема только C++? Другими словами, делает ли rvalue references
C++11 еще более эффективным по сравнению с C# или Java?
Что касается C# (в нем разрешена перегрузка операторов), допустим, у нас есть класс математического вектора, и мы используем его следующим образом.
vector_a = vector_b + vector_c;
Компилятор обязательно преобразует vector_b + vector_c
в некоторый временный объект (назовем его vector_tmp
).
Теперь я не думаю, что C# сможет отличить временное r-значение, такое как vector_tmp
, от l-значения, такого как vector_b
, поэтому нам все равно придется копировать данные в vector_a
, чего можно легко избежать, используя rvalue references
и move semantics
в C++11.