2013-07-08 19 views
4

我已經定義了一個包含整數向量的結構。然後我在矢量中插入10個整數並檢查struct的大小。但我沒有看到任何區別。爲什麼struct的大小恆定,儘管有一個向量int

這裏是我的代碼:

struct data 
{ 
    vector<int> points; 
} 

int main() 
{ 
    data d; 
    cout << sizeof(d) << endl; 
    for (int i=0; i< 10; ++i) 
    d.points.push_back(i) 
    cout << sizeof(d) << endl; 

在這兩種情況下,我得到了相同的結果:

爲什麼會這樣呢? struct的大小不應該增長嗎?

+1

結構是一個指向內存位置的指針,它將始終具有相同的大小。您需要size_of內容以獲取成員數據的總和。 –

+1

提示:sizeof是C++中的編譯時結構 – PlasmaHH

回答

7

sizeof運算符是一個編譯時操作,它爲您提供用於維護容器的數據結構的大小,不包括存儲的元素的大小。

雖然這可能似乎不是第一次太直觀,可以考慮當你使用std::vector您使用少量的本地存儲(在其中創建std::vector)用於維持指針到不同的區域保持實際數據。當矢量增長時,數據塊將增長,但控制結構仍然相同。

sizeof不會改變在它的生命週期是很重要的,因爲這是確保編譯器可以爲points分配內部data空間,而不與其他可能的構件干涉的唯一途徑的事實:

struct data2 { 
    int x; 
    std::vector<int> points; 
    int y; 
}; 

如果對象(std::vector在這種情況下)的大小物生長,將擴大在分配給y突破可能取決於其位置的任何代碼的空間:

data2 d; 
int *p = &d.y; 
d.points.push_back(5); 
// does `p` still point to `&d.y`? or did the vector grow over `y`? 
+0

一個相關的問題是,儘管在C++中使用數組的次數不如在「舊」C中那麼多,但將任何可定義的類型(包括向量)存儲在數組中都是合法的,並且數組中的所有項必須具有相同的大小。 – supercat

10

A vector將其元素存儲在動態分配的內存中(在堆上)。在內部,這個威力被表示爲:

T* elems;  // Pointer memory. 
size_t count; // Current number of elements. 
size_t capacity; // Total number of elements that can be held. 

所以sizeof(std::vector)是它含有作爲它計算sizeof其內置物(在這個簡單的例子大致sizeof(T*) + (2 * sizeof(size_t)))元件的數量的影響。

+0

常用的方法是三個指針,而*中的斜體可能*表示您知道實現可以使用指針而不是整數,但我仍然認爲提及這一點很重要還需要第三個數據元素:矢量的容量,用於確定矢量何時需要增長。另外還有一個分配器,但是通常會進行優化(空基優化) –

+0

一般來說你是對的,但是...我認爲你不能實現一個沒有至少三個指針的std :: vector, /或'size_t'。 (我見過的所有實現都使用了三個指針,或者更多,當調試打開時。) –

+0

@DavidRodríguez-dribeas(和@JamesKanze)同意。當你評論時,只是在考慮這一點。將更新。謝謝。 – hmjd

相關問題