在填充成员向量期间避免复制构造函数
Avoiding copy constructor during populating member vector
我有一个 class A
:
class A {
int value1;
int value2;
std::string text;
public:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(text) { }
};
还有一些"container"classB
:
class B {
std::vector<A> objects;
...
public:
...
void addObject(A a) {
objects.push_back(a);
}
};
和代码:
B b;
A a(2, 5, "test");
b.addObject(a);
//I no longer need a from now on
我的问题是,如何优化 B::addObject(A a)
以避免任何复制。我想要实现的是通过 B
的方法将 A
类型的新对象添加到 B.objects
。
您可以更改addObject
的参数类型并使用emplace_back
,以避免构造一个稍后不会被使用的A
的对象并将其复制到vector
。例如
void addObject(int value1, int value2, std::string text) {
objects.emplace_back(value1, value2, text);
}
和
B b;
b.addObject(2, 5, "test"); // construct the element directly into the vector without constructing A
这个问题有很多答案。您可以将 B
函数更改为 move()
,并将 move()
更改为该函数:
void addObject(A a) { objects.push_back(std::move(a)); }
b.addObject(std::move(a)); // two moves
您可以添加 addObject
的重载,这些重载由 const 左值引用和右值引用
void addObject(A const& a) { objects.push_back(a); }
void addObject(A&& a) { objects.push_back(std::move(a)); }
b.addObject(std::move(a)); // one move
您可以为 addObject
添加一个函数模板,放置:
template <class... Args>
void addObject(Args&&... args) { objects.emplace_back(std::forward<Args>(args)...); }
b.addObject(2, 5, "test"); // zero moves
无论如何,这里有一个完全不必要的副本:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(text) { }
你想要:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(std::move(text)) { }
我有一个 class A
:
class A {
int value1;
int value2;
std::string text;
public:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(text) { }
};
还有一些"container"classB
:
class B {
std::vector<A> objects;
...
public:
...
void addObject(A a) {
objects.push_back(a);
}
};
和代码:
B b;
A a(2, 5, "test");
b.addObject(a);
//I no longer need a from now on
我的问题是,如何优化 B::addObject(A a)
以避免任何复制。我想要实现的是通过 B
的方法将 A
类型的新对象添加到 B.objects
。
您可以更改addObject
的参数类型并使用emplace_back
,以避免构造一个稍后不会被使用的A
的对象并将其复制到vector
。例如
void addObject(int value1, int value2, std::string text) {
objects.emplace_back(value1, value2, text);
}
和
B b;
b.addObject(2, 5, "test"); // construct the element directly into the vector without constructing A
这个问题有很多答案。您可以将 B
函数更改为 move()
,并将 move()
更改为该函数:
void addObject(A a) { objects.push_back(std::move(a)); }
b.addObject(std::move(a)); // two moves
您可以添加 addObject
的重载,这些重载由 const 左值引用和右值引用
void addObject(A const& a) { objects.push_back(a); }
void addObject(A&& a) { objects.push_back(std::move(a)); }
b.addObject(std::move(a)); // one move
您可以为 addObject
添加一个函数模板,放置:
template <class... Args>
void addObject(Args&&... args) { objects.emplace_back(std::forward<Args>(args)...); }
b.addObject(2, 5, "test"); // zero moves
无论如何,这里有一个完全不必要的副本:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(text) { }
你想要:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(std::move(text)) { }