728x90
반응형
std::vector에서 push_back 함수는 '객체'를 집어넣는 형식으로 객체가 없이 삽입하려면 '임시 객체'가 있어야 한다.
#include <vector>
#include <string>
#include <iostream>
using namespace std;
struct item_t
{
item_t() : aa("default"), vv(0) {}
item_t(string a, int v)
{
aa = a;
vv = v;
}
string aa;
int vv;
};
int main()
{
vector<item_t> items;
item_t item = {}; // 기본 생성자
items.push_back(item_t("abc", 3));
items.push_back(std::move(item));
cout << "item[0] : " << items[0].aa << endl;
cout << "item[1] : " << items[1].aa << endl;
return 0;
}
결과적으로 push_back을 사용하면 복사 생성자를 통해 push_back 함수 내에서 임시 객체를 만든다. 하지만 emplace_back을 이용하면 객체 생성에 필요한 인자만 받아 객체에 삽입한다.
int main()
{
vector<item_t> items;
items.emplace_back("abc", 3);
cout << "item[0] : " << items[0].aa << endl;
return 0;
}
임시 객체를 만들 필요가 없기 때문에, emplace_back 내부에 삽입에 필요한 생성자 한 번만 호출하면 된다.
상기와 같은 이유로 보통의 경우에는 emplace_push가 더 빠르다. 하지만 최신 STL에서 그 차이는 미미하며 (push_back이 최적화가 이뤄지고 있기 때문) 둘의 차이는 생성자를 호출하는 부분이라고 한다. 그리고 특정 경우에 emplace_back의 경우는 컴파일이 에러를 잡아내지 못하는 경우도 있기 때문에 상황에 맞게 사용하면 될 것 같다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] std::thread 종료 (abort() has been called) (0) | 2021.10.26 |
---|---|
[C++] 스마트 포인터 (0) | 2021.10.25 |
[C++] 윈도우즈에서 텍스트로 함수 호출 (2) | 2021.10.22 |
error C2558 : no copy constructor available or copy constructor is declared 'explicit' (4) | 2021.10.21 |
[C++] std::async (0) | 2021.10.19 |