我有一个函数从日志文件中读取行,将这些行转换为某个类并返回此类的实例的STL列表.
我应该如何声明这个函数,以便在将它归因于调用者时不复制整个列表?
不失一般性,假设:
list<Request> requests = log_manipulator.getAsRequestList();
Run Code Online (Sandbox Code Playgroud)
我该如何申报getAsRequestList()?我应该返回对列表的引用还是只返回一个列表?
这是一个严重的问题,因为在这个特定的赋值中,列表将包含大约1.5M的元素,因此这样的错误可能会增加内存使用量.
Ale*_*lli 14
不建议返回引用,返回列表对象将导致复制.最好的方法是更改方法的签名以接受并填充列表引用:
list<Request> requests;
log_manipulator.getRequestListByRef(requests);
Run Code Online (Sandbox Code Playgroud)
与void getRequestListByRef(list<Request>&)作为方法的签名.
Sho*_*og9 10
你有两个简单的选择:
void getAsRequestList(list<Request>& requests);
Run Code Online (Sandbox Code Playgroud)
...
list<Request> requests;
log_manipulator.getAsRequestList(requests);
Run Code Online (Sandbox Code Playgroud)
template <class OutputIterator>
void getAsRequestList(OutputIterator dest);
...
list<Request> requests;
log_manipulator.getAsRequestList(
insert_iterator< list<Request> >(requests, requests.begin()) );
Run Code Online (Sandbox Code Playgroud)
您可以通过返回一个简单的列表来逃避 - 搜索"返回值优化"以获取详细信息.简单地说,允许编译器生成绕过昂贵的复制构造函数的代码.
只有在尝试了这个并且对结果不满意之后,我才会推荐其他答案中建议的"填充"版本.这很丑陋.
当然,需要注意的是RVO并不能保证会发生.