[英]What happens when you increase the size of a struct in a vector?
我正在處理的一個問題涉及一個大的樹結構。 最初我是通過new
新節點並將它們附加到父節點等來創建樹。 這花了很長時間。 一位朋友建議我放棄動態內存分配,並將樹結構化為具有子字偏移量的數組。 我之前沒有這樣做過,所以我對實際發生的事情有一些疑問。
這是超基本的,沒有任何安全檢查的例子:
struct DataStructure
{
std::vector<Entry> mCollection;
};
struct Entry
{
char mValue;
std::vector<unsigned int> mOffsetCollection; //a vector of indexes that are offsets to other entries.
};
我很好奇當我向這個結構添加更多數據時會發生什么。 如果我加了
DataStructure d;
Entry entry;
entry.mValue = 'a';
d.push_back(entry);
.
.
.//add some more entries...
.
.
//now suppose I add a bunch of offsets to these various entries in my array.
Entry& firstEntry = d.at(0);
firstEntry.mOffsetCollection.push_back(4);
firstEntry.mOffsetCollection.push_back(9);
firstEntry.mOffsetCollection.push_back(32);
..
所以第一個條目的大小正在增加。 究竟發生了什么? 我剛剛通過一個小例子,似乎工作正常。 數據結構中的其他條目不受影響。 我最初擔心的是,如果結構的大小變大,它可能會遇到陣列中的下一個項目,但我想這不會發生。 這讓我意識到我真的不知道幕后發生了什么。 在vector<Entry>
在DataStructure d
具有重新分配存儲器?
是的, std::vector
動態管理自己的內存。
結構的大小(實際上,任何數據類型)在編譯時是固定的; 它在運行時不受影響。
您沒有使用動態分配,但矢量類是。 內部vector<int>
將其可變長度數組存儲在您放入外部向量的Entry對象的外部。
std::vector
的大小是常量,因為它在內部使用指向堆塊的指針存儲數據,通常它有一個開始,結束和當前指針,而不是其他很多,使它也很小。
這可能看起來很挑剔,但你選擇的措辭會讓我失望,我懷疑它可能會讓你失望......
增加向量中結構的大小會發生什么?
請記住, struct
本身的大小永遠不會改變,任何結構在運行時也不會改變大小。
如果你在程序開頭做sizeof(DataStructure)
,然后再推回一堆東西並再次執行sizeof(DataStructure)
,結果將完全相同。 這是因為你推回數據不是部分 DataStructure
iself,而是由一些指向 DataStructure
。
我在說什么指針? 在vector
。 vector
也永遠不會改變大小 - 但它內的項目數量確實如此。 vector
管理指向一些動態分配的東西的指針,這些東西正在推回。 隨着你推回更多的東西,托管陣列填滿了。 當托管數組最終滿載capacity()
, vector
必須分配一個新的更大的數組並將你的東西復制到它(這就是為什么包含STL的對象必須是“可復制的”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.