Program Language/C & C++

[C++] emplace_back

야곰야곰+책벌레 2021. 10. 25. 10:01
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
반응형