请看下面这两个C++函数及其使用示例:
vector<int> makeVect() {
vector<int> v = {1,2,3};
return v;
}
//usage
auto v = makeVect(); //vector is moved
void addFour(vector<int> &v) {
v.push(4);
}
//usage
addFour(v); //v is passed in as reference
两种情况下都不会发生复制,这非常高效。
以下是对应的Haskell函数和用法:
makeVect :: (Num a) => [a]
makeVect = [1,2,3]
--usage
--Q1: is [1,2,3] copied or moved to v?
let v = makeVect
addFour :: (Num a) => [a] -> [a]
addFour xs = xs ++ [4]
--usage
--Q2: is the parameter copied or moved into the function?
--Q3: on return, is the result copied or moved out of the function?
addFour v
代码中有Q1、Q2、Q3三个问题。Haskell是否会移动或复制数据?是否有方法可以控制它?在这些情况下,Haskell与C++相比效率如何?
String s = "Hi".clone();
会抛出异常。然而这个可以:String s = new String("Hi");
。 - Pedro Rodriguesv
使用的内存位置下方。但是,这种考虑通常对于垃圾收集语言总体而言都没有意义,尤其是对于Haskell而言,因为数据结构从不驻留在堆栈上。 - leftaroundabout