2012-09-20 38 views
3

如果我宣佈一個載體,像這樣:在C++中如何擴展堆棧分配的向量?

int main() { 
    vector<string> names; 
    int something_else_on_the_stack = 0; 
    names.add("John"); 
    names.add("Annie"); 
} 

你怎麼居然能元素「添加」到名字載體?如果名稱是堆棧分配的,那麼它不應該在堆棧中的「something_else_on_the_stack」之後?那麼如何將名稱添加到已分配的矢量?

+0

請原諒我,如果我錯了,但不是std ::矢量數據總是堆分配? –

+0

@AndreasHenning向量是堆棧分配的,它的數據通常是動態分配的,但C++標準沒有提到任何有關堆棧或堆的內容。 – juanchopanza

回答

8

在內部,vector<string>很可能由指向實際數據的string*和可能兩個指示佔用和保留內存的成員size_t構成。其餘的將在堆上。因此,sizeof(vector<string>)是固定的,堆棧上的分配不會改變。

7

std::vector內部維護一個指向堆分配空間的指針,根據需要調整大小。堆棧上的佔用空間不會改變。

2

vector<string>在堆棧上佔用的大小是固定的,並且通常等於3個指針的大小(這是特定於實現的)。指針指向存儲的開始,矢量容量和矢量大小。這些指針指向向量根據需要分配以存放添加到向量中的對象的空閒存儲器內存(或堆,如果您想調用它)。