Rob*_*lan 5 c++ move-semantics c++11 return-by-value
在C++ 11之前,如果我有一个在大型对象上运行的函数,我的本能就是用这种原型编写函数.
void f(A &return_value, A const ¶meter_value);
Run Code Online (Sandbox Code Playgroud)
(这里,return_value只是一个空白对象,它将接收函数的输出.A只是一些庞大且复制成本高的类.)
在C++ 11中,利用移动语义,默认建议(据我所知)更直接:
A f(A const ¶meter_value);
Run Code Online (Sandbox Code Playgroud)
是否仍然需要以旧方式执行此操作,传入一个对象来保存返回值?
其他人已经介绍了A可能没有廉价移动构造函数的情况.我假设你A的确如此.但是还有一种情况可能需要传入"out"参数:
如果A类似某些类型vector或者string已知"out"参数已经具有可以在其中重用的资源(例如内存)f,那么如果可以的话,重用该资源是有意义的.例如考虑:
void get_info(std::string&);
bool process_info(const std::string&);
void
foo()
{
std::string info;
for (bool not_done = true; not_done;)
{
info.clear();
get_info(info);
not_done = process_info(info);
}
}
Run Code Online (Sandbox Code Playgroud)
VS:
std::string get_info();
bool process_info(const std::string&);
void
foo()
{
for (bool not_done = true; not_done;)
{
std::string info = get_info();
not_done = process_info(info);
}
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,容量将string在循环执行时积累,然后该容量可能在循环的每次迭代中重复使用.在第二种情况下,string在每次迭代时分配一个new (忽略小字符串优化缓冲区).
现在这并不是说你永远不应该std::string按价值回报.只是你应该了解这个问题并根据具体情况应用工程判断.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |