簡體   English   中英

在這種情況下,std :: stack :: push()和std :: stack :: emplace()之間有區別嗎?

[英]Is there a difference between std::stack::push() and std::stack::emplace() in this case?

看看這段代碼:

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()是否在進程中創建任何臨時對象?

沒有臨時的人。 對於標准, push看起來像:

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

雖然emplace看起來像:

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

其中c是底層容器,默認為deque<T> 所以在前一種情況下,當你調用push時,你正在調用push(const Dummy&) ,它將通過Dummy(const Dummy&)創建一個新對象。 在后一種情況下,您正在調用emplace_back(Dummy&) ,它通過Dummy(Dummy&)直接創建一個新對象。

在您的情況下 - 這兩個副本構造函數之間沒有區別。 它們都會調用由編譯器隱式創建的普通復制構造函數。 因此,您應該看到(1)(2)調用之間沒有行為差異。

如果一個或另一個構造函數不存在(在這種情況下,一個或另一個不會編譯),或者如果它們做了不同的事情,那么只會有區別。

而不是采用value_type emplace采用可變參數列表,這意味着您現在可以完美地轉發參數並直接將對象構造到容器中,而不是臨時的,這可能與涉及臨時性的推動相反。

以下是emplace的標准定義: -

將新元素推送到堆棧頂部。 元素就地構造,即不執行復制或移動操作。 使用與提供給函數完全相同的參數調用元素的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM