2014-11-03 1 views
4

봐 :이 경우 std :: stack :: push()와 std :: stack :: emplace() 사이에 차이점이 있습니까? 이 코드에서

struct Dummy 
{ 
    int bla; 
    int blabla; 
    char character; 

    Dummy (int b, int bb, char c) 
     : bla(b), blabla(bb), character(c) 
    {} 
}; 

std::stack<Dummy> s; 
Dummy dummy; 
s.push(dummy); // (1) 
s.emplace(dummy); // (2) 

나는 (1)(2)의 차이를 볼 실패합니다. 난 당신이 추가되는 개체의 생성자에 대한 인수를 제공 할 때 emplace() 유용 알고, 예를 들면 :

s.emplace(1, 2, 'c'); 

하지만 난 모르는 차이가 나는 두 push()emplace() 때문에 설명하는 경우에 무엇을해야 로컬 dummy 개체에 대한 참조를 가져 와서 copy ctor 또는 이와 유사한 것을 사용하여 새 개체를 만듭니다. push() 과정에서 임시 개체를 만드나요?

+0

왜 차이가있을 필요가 있다고 생각하십니까? 일반적으로, emplace는 푸시 (push),보다 일반적이고 때로는 더 효율적입니다. – rici

+0

둘 다 전달 된 인수의 복사본을 구성하기 때문에 차이가 없습니다.'emplace()'는 전달 인수를 완벽하게하고 싶을 때 유용합니다. – 0x499602D2

+0

두 번째 호출 Dummy :: Dummy (const Dummy &)는 전달할 매개 변수 이후가 아니겠습니까? 나는 s.emplace()와 같이 emplace를 사용하는 것을 보았습니다. – Exceptyon

답변

5

일시적 요소가 없습니다. emplace 반면

void push(const value_type& x) { c.push_back(x); } 
void push(value_type&& x) { c.push_back(std::move(x)); } 

은 다음과 같습니다 : 표준의 경우, push처럼 보이는 cdeque<T>을 디폴트, 기본 컨테이너입니다

template <class... Args> 
void emplace(Args&&... args) { 
    c.emplace_back(std::forward<Args>(args)...); 
} 

. 따라서 이전의 경우 push를 호출하면 push(const Dummy&)을 호출하여 Dummy(const Dummy&)을 통해 새 객체를 만듭니다. 후자의 경우 Dummy(Dummy&)을 통해 새 오브젝트를 직접 생성하는 emplace_back(Dummy&)으로 호출합니다.

귀하의 경우 -이 두 복사 생성자간에 차이점은 없습니다. 그들은 컴파일러에 의해 암시 적으로 생성 된 간단한 복사 생성자를 호출합니다. 따라서 (1)(2) 호출간에 동작 차이는 없어야합니다.

하나 또는 다른 생성자가 존재하지 않는 경우 (하나 또는 다른 컴파일되지 않음) 또는 다른 작업을 한 경우에만 차이가 발생합니다.

+0

암시적인'Dummy (Dummy &)'생성자가 있습니까? – 0x499602D2

+0

암시적인'Dummy (const Dummy &)'가 있는데, 이것은 const가 아닌 ref로 호출 될 것입니다. – Barry

0

대신에 value_type을 취하면 emplace는 가변 인수 목록을 취합니다. 즉, 임시 인수가 포함될 수있는 push와는 달리 일시적으로 컨테이너에 인수를 완벽하게 전달할 수 있습니다.

은 아래에 갖다 두도록 표준 정의입니다 : -

스택의 상단에 새로운 요소를 넣습니다. 요소가 제자리에서 생성됩니다. 즉 복사 또는 이동 작업이 수행되지 않습니다. 요소의 생성자는 함수에 제공된 것과 동일한 인수로 호출됩니다.

관련 문제