簡體   English   中英

STL容器如何復制對象?

[英]How do STL containers copy objects?

我知道像vector這樣的STL容器會在添加對象時復制該對象。 push_back方法如下:

void push_back ( const T& x );

我很驚訝地看到它將該項目作為參考 我寫了一個示例程序,看它是如何工作的。

struct Foo
{
    Foo()
    {
        std::cout << "Inside Foo constructor" << std::endl;
    }

    Foo(const Foo& f)
    {
        std::cout << "inside copy constructor" << std::endl;
    }
};

Foo f;
std::vector<Foo> foos;
foos.push_back(f);

這復制了對象,我可以看到它正在調用copy-constructor

我的問題是,當push_back將item作為引用時,它是如何調用copy-constructor的? 或者我在這里遺漏了什么?

有什么想法嗎..?

它可能使用“placement new ”在其內部數組中就地構造對象。 Placement new不會分配任何內存; 它只是將對象放在您指定的位置,並調用構造函數。 語法是new (address) Class(constructor_arguments)

調用復制構造函數T::T(T const &)以就地創建副本。 像這樣(簡化):

template<T>
void vector<T>::push_back(T const &item) {
    // resize if necessary
    new (&d_array[d_size++]) T(item);
}

請注意, T必須具有復制構造函數才能使其正常工作。 默認情況下(如果你什么都不做),它會免費獲得一個。 如果您明確定義它,它必須是publicvector<T>才能工作。

這是GNU的libstdc ++如何做到這一點 ,但我懷疑它會非常具有啟發性。 有一個分配器( vector的第二個模板參數)使它不那么簡單。

C ++ SDK總是將const T &作為函數參數來提高效率。

在你的情況下,如果它將T作為參數,則復制操作將完成兩次,一次用於將其傳遞給函數push_back(f) ,一次用於內部將其添加到容器中。 通過將const T&作為參數,只需要一份副本!

它使用placement new運算符並將其復制構造為單位化內存;

placement new在內存中的指定地址處創建一個新元素,在vector case中,當前end();

void push_back(const T& val){
::new (&*end()) T(val);
[increase end]
}

查看http://spotep.com/dev/devector.h ,它具有非常清晰的代碼(與大多數STL實現相反)。

暫無
暫無

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

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