首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-09-08 
如何让函数返回临时对象时减少不必要的构造C/C++ code//-------------------------------------ListStrin

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

C/C++ code
//-------------------------------------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,自然是最优的。

求尽可能完美方案。(必须返回临时对象)

[解决办法]
主流的编译器都会自动做RVO的
[解决办法]
static
[解决办法]
提供拷贝构造函数 编译器会NRV优化
[解决办法]
return List<String>(100, String(T("rrrfff")));
[解决办法]
不要返回值,传递引用参数。
C/C++ code
//-------------------------------------bool GetListObj(List<String>& strList){    //第一次 构造临时对象    for (int i = 0; i<= 99; i++)    {        strList.Add(String(T("rrrfff")));    } //for    //第二次 复制一份临时对象 析构原来的临时对象    return true;}
[解决办法]
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
}
[解决办法]
List中木有转移构造函数(move constructor)吗
[解决办法]
这个问题我也问过.

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

这个问题我也问过.

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

[解决办法]
不知道

热点排行