如何让函数返回临时对象时减少不必要的构造

RLib 2012-08-06 10:09:27

//-------------------------------------------------------------------------
List<String> GetListObj()
{
//第一次 构造临时对象
List<String> strList;
for (int i = 0; i<= 99; i++)
{
strList.Add(String(T("rrrfff")));
} //for
//第二次 复制一份临时对象 析构原来的临时对象
return strList;
}
//-------------------------------------------------------------------------
void Test_GetListbj()
{
List<String> obj = GetListObj();//第三次 把返回的临时对象复制(构造)局部对象 析构返回的临时对象
List<String> &obj2 = GetListObj();//和第三次一样
List<String> &&obj3 = GetListObj();//和第三次一样
}


如果能把 第一次构造的临时对象 的控制权交与obj,自然是最优的。

求尽可能完美方案。(必须返回临时对象)
...全文
247 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2012-08-06
  • 打赏
  • 举报
回复
其实最好是从参数走,专业一点。
healer_kx 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

这个问题我也问过.

得出的结论是:
1.NRV
2.c++11 的move 语义
3.http://en.wikipedia.org/wiki/Expression_templates
4.等等
[/Quote]

全面。
iamnobody 2012-08-06
  • 打赏
  • 举报
回复
还有引用计数, QT的私有类共享.
iamnobody 2012-08-06
  • 打赏
  • 举报
回复
这个问题我也问过.

得出的结论是:
1.NRV
2.c++11 的move 语义
3.http://en.wikipedia.org/wiki/Expression_templates
4.等等
zhouzhipen 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 11 楼 的回复:

不要返回值,传递引用参数。
C/C++ code

//-------------------------------------------------------------------------
bool GetListObj(List<String>&amp; strList)
{
//第一次 构造临时对象
for (int i ……
[/Quote]
不知道是什么项目,会有这种奇怪的要求,如果只能返回临时对象,就只有改造List<String>,派生出一个临时对象类,在这个类中不会析构。在复制构造时,只传递指针(VC2008以上的MFC 中CString就采用了这种机制)。
或者一些特定编译器,做一些特定的优化。
MC_LoveX 2012-08-06
  • 打赏
  • 举报
回复
我相信这个题目没有解
changbaolong 2012-08-06
  • 打赏
  • 举报
回复
或者把List<String> strList;用指针的方式代替:
List<String> *strList = new List<String>;
返回值就返回指针了~
如何非要返回临时对象,那我这里是无解了~
机智的呆呆 2012-08-06
  • 打赏
  • 举报
回复
List中木有转移构造函数(move constructor)吗
RLib 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复

先等会儿,你这List String都首字母大写用的是哪家的STL?
[/Quote]

自家的东西。
RLib 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

不要返回值,传递引用参数。
C/C++ code

//-------------------------------------------------------------------------
bool GetListObj(List<String>& strList)
{
//第一次 构造临时对象
for (int i = 0; i<= 99; i++)
……
[/Quote]

必须返回临时对象,不可以用指针或引用。。。无奈#10楼。
changbaolong 2012-08-06
  • 打赏
  • 举报
回复
List<String> GetListObj()
{
//第一次 构造临时对象
List<String> strList;
for (int i = 0; i<= 99; i++)
{
strList.Add(String(T("rrrfff")));
} //for
//第二次 复制一份临时对象 析构原来的临时对象
return strList;
}
// ------------------------------------------------------
你可以把List<String> &strList;作为参数,按引用传递
void GetListObj(List<String> &strList)
{
for (int i = 0; i<= 99; i++)
{
strList.Add(String(T("rrrfff")));
} //for
}
ohayou 2012-08-06
  • 打赏
  • 举报
回复
先等会儿,你这List String都首字母大写用的是哪家的STL?
zhouzhipen 2012-08-06
  • 打赏
  • 举报
回复
不要返回值,传递引用参数。

//-------------------------------------------------------------------------
bool GetListObj(List<String>& strList)
{
//第一次 构造临时对象
for (int i = 0; i<= 99; i++)
{
strList.Add(String(T("rrrfff")));
} //for
//第二次 复制一份临时对象 析构原来的临时对象
return true;
}
RLib 2012-08-06
  • 打赏
  • 举报
回复

List<String> &obj = (List<String> &)GetListObj();
List<String> &obj2 = (List<String>)GetListObj();

编译生成的汇编代码不一样
RLib 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

另外你后面两句好像不太对吧,
List<String> &obj2 = GetListObj();
List<String> &&obj3 = GetListObj();
临时对象的引用
[/Quote]

List<String> &obj2 = GetListObj();
这句本来应该报错, 但是编译器却把他视为
List<String> obj2 = GetListObj();
所以编译通过了.

List<String> &&obj3 = GetListObj();
右值引用可以绑定临时对象
RLib 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

另外你后面两句好像不太对吧,
List<String> &obj2 = GetListObj();
List<String> &obj3 = GetListObj();
临时对象的引用
[/Quote]

List<String> &obj2 = GetListObj();
这句本来应该报错, 但是编译器却把他视为
List<String> obj2 = GetListObj();
所以编译通过了.

List<String> &obj3 = GetListObj();
右值引用可以绑定临时对象
可见一斑 2012-08-06
  • 打赏
  • 举报
回复
return List<String>(100, String(T("rrrfff")));
IVERS0N 2012-08-06
  • 打赏
  • 举报
回复
提供拷贝构造函数 编译器会NRV优化
ohayou 2012-08-06
  • 打赏
  • 举报
回复
另外你后面两句好像不太对吧,
List<String> &obj2 = GetListObj();
List<String> &&obj3 = GetListObj();
临时对象的引用
RLib 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

static
[/Quote]

必须返回临时对象
加载更多回复(4)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧