[英]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
必須具有復制構造函數才能使其正常工作。 默認情況下(如果你什么都不做),它會免費獲得一個。 如果您明確定義它,它必須是public
的vector<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.