STL等容器操作,优先采用元素原地安置(Emplace Operations)
【说明】 :emplace等方法是C++11之后新增加的成员方法,可以替代传统的insert和push_back等。这些函数可以在容器的内存空间里面直接构造一个对象。
【原理】 :STL容器在C++11之前要插入一个对象,需要先构造出对象,调用传统插入函数时容器内部通过使用拷贝构造函数或者移动拷贝构造函数在对应的内存里面重新构造出一个对象。而使用emplace相关函数可以在容器内部直接调用改对象的构造函数创建出对象,减少内存拷贝和移动,同时语法也比较简洁,避免生成临时对象。
【注意事项】 不涉及
【案例】
优化前:
class Data {
public:
Data(uint32_t id, std::string name, uint8_t type) :id(id), name(s), type(type) { }
~Data() { }
Data(const Data &rhs)
{
id = rhs.id;
name = rhs.name;
type = rhs.type;
}
// 省略赋值构造函数和移动赋值构造函数、移动拷贝构造函数
private:
uint32_t id;
std::string name;
uint8_t type;
}
void Func()
{
...
Data obj(1,"Jhon", 2);
std::vector<Data> vec;
vec.push_back(obj);
...
}
说明:创建了一个对象obj,然后拷贝到vec里面,调用了2次相关构造函数:第一次是构造函数,第二次是拷贝构造函数。使用emplace_back后,可以直接在容器内部直接构造一个对象,可以节省一次拷贝构造函数的调用。
优化后:
...
void Func()
{
...
std::vector<Data> vec;
vec.emplace_back(1,"Jhon", 2);
...
}
父主题: C++语言