c – 为了支持移动语义,函数参数应该由unique_ptr,value还是rvalue获取?
作者:互联网
我的一个函数将vector作为参数并将其存储为成员变量.我正在使用const引用,如下所述.
class Test {
public:
void someFunction(const std::vector<string>& items) {
m_items = items;
}
private:
std::vector<string> m_items;
};
但是,有时项目包含大量字符串,因此我想添加一个支持移动语义的函数(或用新函数替换该函数).
我正在考虑几种方法,但我不确定选择哪一种方法.
1)unique_ptr
void someFunction(std::unique_ptr<std::vector<string>> items) {
// Also, make `m_itmes` std::unique_ptr<std::vector<string>>
m_items = std::move(items);
}
2)按值传递并移动
void someFunction(std::vector<string> items) {
m_items = std::move(items);
}
3)右值
void someFunction(std::vector<string>&& items) {
m_items = std::move(items);
}
我应该避免哪种方法?为什么?
解决方法:
除非你有理由让向量存在于堆上,否则我建议不要使用unique_ptr
无论如何,向量的内部存储都存在于堆上,因此如果使用unique_ptr,则需要2度间接,一个用于取消引用向量的指针,再次取消引用内部存储缓冲区.
因此,我建议使用2或3.
如果你使用选项3(需要右值引用),那么当你调用someFunction时,你要求你的类的用户传递一个右值(直接来自临时值,或者从左值移动).
从左值移动的要求是繁重的.
如果您的用户想要保留向量的副本,他们必须跳过箍来这样做.
std::vector<string> items = { "1", "2", "3" };
Test t;
std::vector<string> copy = items; // have to copy first
t.someFunction(std::move(items));
但是,如果你使用选项2,用户可以决定是否要保留副本 – 选择是他们的
保留一份副本:
std::vector<string> items = { "1", "2", "3" };
Test t;
t.someFunction(items); // pass items directly - we keep a copy
不要保留副本:
std::vector<string> items = { "1", "2", "3" };
Test t;
t.someFunction(std::move(items)); // move items - we don't keep a copy
标签:c,c11,move,vector,unique-ptr 来源: https://codeday.me/bug/20190930/1835586.html