vector和list記憶體結構

2021-07-26 05:22:38 字數 1854 閱讀 1958

vector是std庫提供的類似於陣列的容器,在使用c語言陣列的時候會遇到限制,陣列大小不能動態擴充套件。

vector就是應對陣列限制的一種支援動態增長容器。

首先看下面的例項

#include

int main(int argc ,char **argv)

(gdb) info locals

vector = , }, _m_start = 0x46ca318,

_m_finish = 0x46ca320, _m_end_of_storage = 0x46ca320}}, }

從gdb中可以看到vector主要由4個變數組成,乙個是記憶體分配器,另外3個是變數位址。

從我個人的理解,vector可以看出乙個棧結構,_m_start是棧基,_m_end_of_storage是棧頂, _m_finish可以看成

vector中的結束位游標。

列印記憶體可以看到,在這段類似棧結構的記憶體當中。連續儲存了我們壓棧的資料。

0x4ef08a8:      0x00000001      0x00000002      0x00000003     0x00000021

0x4ef08b8:      0x00000000      0x00000000      0x00000000      0x00000000

同時,由於vector是連續記憶體段,所以在使用迭起器的時候,需要注意迭起器失效的問題。

並且vector是非執行緒安全的介面,所以使用時也主要保護。

list是資料結構中的鍊錶的實現,看如下例項

#include

int main(int argc ,char **argv)

(gdb) info locals

the_list = , },

_m_node = }}, }

可以看到上面節點資料中,儲存了前乙個節點和後乙個節點的記憶體位址。

列印前後記憶體位址可以得到當前節點的第三位是壓入的data資料。

(gdb) x /8xw 0x4f670e8           

0x4f670e8:      0x04f31e20      0x3c1d2da0      0x00000001      0x00000059

0x4f670f8:      0x01139cf0      0x04f683e0      0x00000005      0x04f68938

(gdb) x /8xw 0x4f8a408

0x4f8a408:      0x3c1d2da0      0x04f96c40      0x00000004      0x00000059

0x4f8a418:      0x00000000      0x00000030      0x04f89d30      0x04f8a4c8

(gdb) x /8xw 0x04f96c40

0x4f96c40:      0x04f8a408      0x04f31e20      0x00000003      0x00000029

0x4f96c50:      0x0000000a      0x0000000a      0x00000000      0x7473696c

(gdb) x /8xw 0x04f31e20         

0x4f31e20:      0x04f96c40      0x04f670e8      0x00000002      0x00000011

0x4f31e30:      0x04f30048      0x04f11e50      0x00000010      0x00000019

並且最後乙個節點指向了第乙個資料,形成閉環。

list容器和vector一樣,是非執行緒安全庫,多執行緒使用時請注意資料同步

list和用vector區別

list和用vector區別 stl提供了三個最基本的容器 vector,list,deque vector和 built in 陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即 操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷...

list和用vector區別

stl提供了三個最基本的容器 vector,list,deque。vector和built in陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠...

list和vector的區別

vector和built in陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能夠非常好的支援隨機訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝。另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大...