我知道标题听起来很熟悉,因为有很多类似的问题,但我要问问题的不同方面(我知道在堆栈上放置东西并将它们放在堆上之间的区别).
在Java中,我总是可以返回对"本地"对象的引用
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
Run Code Online (Sandbox Code Playgroud)
在C++中,要做类似的事情,我有2个选项
(1)每当我需要"返回"一个对象时,我都可以使用引用
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
Thing thing;
calculateThing(thing);
Run Code Online (Sandbox Code Playgroud)
(2)或者我可以返回指向动态分配对象的指针
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
Thing* thing = calculateThing();
delete thing;
Run Code Online (Sandbox Code Playgroud)
使用第一种方法我不必手动释放内存,但对我而言,它使代码难以阅读.第二种方法的问题是,我必须记住delete thing;,这看起来不太好.我不想返回复制的值,因为它效率低(我认为),所以这里提出问题
是否可以从函数返回标准容器而无需复制?
示例代码:
std::vector<A> MyFunc();
...
std::vector<A> b = MyFunc();
Run Code Online (Sandbox Code Playgroud)
据我所知,这会将返回值复制到一个新的向量b中.使函数返回引用或类似的东西可以避免复制吗?
我有很多C#代码,我必须用C++编写.我在C++方面没有太多经验.
我正在使用Visual Studio 2012来构建.该项目是C++中的静态库(不是在C++/CLI中).
我知道这是一个基本问题,但我一直在阅读,我感到很困惑.在C#代码中,他们在几个地方使用了double []数组,从他们使用它们的方式来看,我看到在C++中替换它们的最好方法是使用vector.
C#中有一些属性可以返回数组的副本,我想在C++中做同样的事情.
注意:myArray是MyClass的成员.
C#
public double[] MyArray
{
get
{
/*** Some Code Here ***/
double[] myCloneArray= (double[])myArray.Clone();
return myCloneArray;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在C++中完成类似的事情,但最大限度地减少创建的副本数量.这是正确的吗?
C++
vector<double> MyClass::GetMyArray()
{
/*** Some Code Here ***/
vector<double> myCloneArray= vector<double>(myArray);
return myCloneArray;
}
Run Code Online (Sandbox Code Playgroud)
我只想创建一个myArray副本.由于我没有返回引用,我的理解是,在返回myCloneArray时,将创建它的副本.这总是如此吗?
我想确定,所以我在互联网上阅读,但我很困惑,因为有些人说有些编译器不这样做.
我想确保我总是发送副本,而不是相同的向量.我现在正在使用编译器,但最终我的代码也将在其他编译器中构建,所以我需要确保这不依赖于编译器
这是我能走的最好的方式吗?或者我可以减少代码,像这样:
C++
vector<double> MyClass::GetMyArray()
{
/*** Some Code Here ***/
return myArray;
}
Run Code Online (Sandbox Code Playgroud)
并且将调用vector(myArray)的复制构造函数?
c++ ×3
copy ×1
performance ×1
reference ×1
return ×1
return-value ×1
stl ×1
temporary ×1
vector ×1