Met*_*est 11 c# c++ java c++11
C++ 03存在可能隐式发生的不必要副本的问题.为此,C++ 11引入rvalue references和move semantics.现在我的问题是,这个不必要的复制问题是否也存在于C#和java等语言中,还是只是一个C++问题?换句话说,rvalue references与C#或Java相比,C++ 11的效率是否更高?
就C#而言(允许运算符重载),假设我们有一个数学向量类,我们就像这样使用它.
vector_a = vector_b + vector_c;
Run Code Online (Sandbox Code Playgroud)
编译器肯定会转换vector_b + vector_c为一些临时对象(让我们调用它vector_tmp).
现在我不认为C#可以区分临时右值vector_tmp或者像左值这样的左值vector_b,因此我们必须将数据复制到vector_a任何地方,这在C++ 11中使用rvalue references和很容易避免move semantics.
C#和Java中的类引用在shared_ptrC++中具有s的一些属性.但是,rvalue引用和移动语义更多地与临时值类型相关,但与C++值类型相比,C#中的值类型非常不灵活,而且从我自己的C#经验来看,你最终会得到类,而不是结构,大多数的时间.
所以我的假设是Java和C#都不会从那些新的C++特性中获得太多利益,这使得代码能够安全地假设某些东西是否是临时的,而不是复制让它只是窃取内容.
是的,C#和java中有不必要的复制操作.
与C#或Java相比,右值引用能否使C++ 11更高效?
答案是肯定的.:)