이번엔 Push_back && emplace_back의 쓰임새와 차이점에대해서 알아보고자 한다.
시작하기에 앞서
결론부터 말하자면
push_back은
1) 객체를 삽입하기 위해서 똑같은 임시 객체를 하나 더 만들어서 거기에 복사한 다음 벡터에 삽입
2) 삽입이 끝나면 임시 객체 파괴
3) 잠깐 쓰고 버릴 메모리를 할당해준다.
3) 임시 객체 생성자를 호출해서 생성하고 소멸자를 불러서 파괴시키는 과정에서 불필요한 연산이 생긴다
=> 다소 비효율적, 속도느림
emplace_back은
1) 가변인자 템플릿을 사용해서 삽입하려는 자료형에 따라 함수 내에서 삽입을 위한 객체를 자체 생성한다.
즉! 똑같은 임시 객체를 만들 필요가 없다
2) 파괴해야 할 임시 객체 자체가 생기지 않는다
3) 잠깐 쓰고 버릴 메모리를 할당할 필요가 없다.
=> push_back에 비해 효율적 ,속도가 빠름, 최적화에 유리하다는 것이다.
또한 이 두 개념은 다양한공간에서 사용되지만 보통 map, vector와같은 컨테이너의 개념에서 이어져서 사용된다.
https://openmynotepad.tistory.com/10
emplace_back 과 push_back 의 차이
item 타입의 생성자가 타입을 인자로 받는다면? push_back 함수는 '객체' 를 집어 넣는 형식으로, 객체가 없이 삽입을 하려면 "임시객체 (rvalue) " 가 있어야 합니다. 또는 암시적 형변환이 가능하다면,
openmynotepad.tistory.com
위의 사이트에서 코드만 가져와서 설명하자면
/// push back
vector<item> vt;
item a = {}; // 기본 생성자 호출
vt.push_back(item("abc", 1, 234));
vt.push_back(std::move(a));
vector<int> v;
v.push_back(1);
push_back을 사용했을때는 기본생성자를 임시로 호출하고 임시 객체를 복사 생성자를 통해 push_back 함수 내에서 임시 객체를 만들어 낸다.
그 후 vector의 끝에 추가를하고 함수가 끝난후 소멸자를 호출시켜주어야하는 과정을 거치는데
emplace를 사용한다면
vector<item> vt
vt.emplace_back("abc",1,234);
일련의 과정을 압축시킬 수 가 있다는것이다.
'프로그래밍 > C++' 카테고리의 다른 글
업캐스팅 &&다운캐스팅 (0) | 2024.02.29 |
---|---|
객체지향(C++)과 절차지향(C)의 차이 (0) | 2024.02.29 |
NameSpace (1) | 2024.02.29 |
C++ 기본 입출 (0) | 2024.02.13 |
프로그래밍을 위한 기초지식 (0) | 2024.02.13 |