簡體   English   中英

增加向量中結構的大小會發生什么?

[英]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.

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