C 中 vector 重新分配記憶體是怎樣實現的?

時間 2021-05-12 06:18:45

1樓:

這個問題很好回答啊

1重新分配記憶體一般是擴大1.5倍 2倍什麼的具體不確定。

2肯定要把原來的物件拷貝過去啊涉及到拷貝初始化物件,則會用到copy建構函式或者移動建構函式(c++ primer第五版一書中講到),c11新添了移動構造所以調研移動構造。若是c98則只能是copy構造咯.

3肯定是虛構原來的物件了.

2樓:路明非

vector中的元素是隨機訪問的,所以分配的是連續記憶體,重新分配一塊的記憶體和原來的記憶體肯定不是連續的,所以會把原來的記憶體元素拷貝到新記憶體裡,然後先析構舊記憶體原有元素然後釋放。

下面是我自己實現的

vector

中的拷貝建構函式和移動建構函式。

vector

(const

self&x

)vector

(self&&x

)noexcept

:// move construct

first(x

.first

),last(x

.last

),end_storage(x

.end_storage)

3樓:Milo Yip

對於問題描述,可以看參考文件,也可以稍測試一下:

C++03的話:

#include

#include

class

FooFoo

(intx)

:x(x

){}Foo(

const

Foo&

rhs)

~Foo

()intx;

};int

main

()而在 C++11 中我們可加入移動建構函式(move constructor),注意需要加上noexcept:

class

Foo}

看看兩種輸出:

$ g++ cpp03.cpp && ./a.out

push_back()

copy constructor 1->2 # v[0].x == 2

reserve()

copy constructor 2->3 # 複製建構函式

destructor 2析構原來的 v[0]

main() ends

destructor 1

destructor 3

$ g++ -std=c++11 cpp11.cpp && ./a.out

push_back()

copy constructor 1->2

reserve()

move constructor 2->3 # 移動建構函式

destructor 0析構原來的 v[0],它被移動所以 x == 0

main() ends

destructor 1

destructor 3

可以看到,在 C++03 時,reserve()的時候重新分配記憶體,需要用複製建構函式(copy constructor)去拷背原有的物件至新的記憶體。

而在 C++11,reserve() 則會用上noexcept的移動建構函式。

一般來說,移動建構函式比複製建構函式高效,所以 C++11 的容器配合具移動建構函式的類,可以進一步提公升程式效能。

4樓:神音

感覺題主是不能區分拷貝構造和移動構造的區別,因為知道了區別就沒有第乙個問題了。

我先回答問題:

1. 拷貝建構函式。

2. 會。

Tips:

1. 其實這兩個問題你寫個測試跑一下就知道了(寫乙個類,宣告拷貝構造,移動構造和析構函式,裡面分別列印幾句話,然後多push_back幾下,看看會輸出什麼)。

2. 如果想深入了解一下為什麼會這樣,可以自己簡單實現乙個vector或者看看原始碼。

如何看待高校學生宿舍重新分配床位?

Yvonne 怎麼講呢,經過這次災難以後,我們表面上看到zg好像還不錯,但是如果認真做一些思考和資料對比以後,會發現我們一直都在治標不治本。換寢室,是無奈之舉,多麼迫於壓力的措施啊 candyleuang 一刀切的無腦規定 對於什麼宿舍需要重新分?四人間要不要?還是只針對10人以上的?沒說就一句重新...

近幾年內社會財富會重新分配嗎?

卡卡 財富每時每刻都在重新分配,但是要理解,90 的財富,再怎麼分配,也分配不到普通民眾的身上。你如果想參與這個分配,需要經過幾代人不要命的努力,讓自己的家族成為 新貴族 才能與 舊貴族 抵抗 隨著科技的發展,這種財富重分配的效率看似在提高,但是從另外某種角度講,財富重分配的門檻也漸漸提高。有些意思...

年輕人都躺平,社會資源才會重新分配嗎?

星羅棋布 看了大家的回答 有覺得躺平可以洗牌的,變革可以洗牌的,有覺得不努力是痴人說夢的。總結下大V和公務人員雞湯比較多,這類人員最有力的理論是,你躺了別人沒有躺,別人贏了你又落後了,然後資本又可以加收你躺的那塊地的租。乍一看好像雞湯都對啊都對。不患寡而患不均 不變哪有革命,都埋頭奮進,別人低頭坐火...