一些可變長度物件(string物件、vector物件 ...)作為結構體或類的成員,會不會動態改變結構體或類所定義的變數的大小呢?
阿新 • • 發佈:2019-01-02
可能是我自身的原因,經常性的杞人憂天!
在接觸到C++的一些類時,想的有點多了。事實證明,我確實想多了。但是我覺得可能會有和我一樣會多想的小夥伴,我在這分享一個我想多了的栗子!
以前,C語言寫結構體時。結構體成員都是基本型別,比如int、char、double之類的,最多也就裡邊再套一個結構體成員,但它們都有一個特點。它們的大小是固定的,我不會有這樣的擔心。但是,我接觸到string、vector這些類型別時,根據它們的特性:它們能動態擴充,就是你來多少內容,我都能存的下!
然後,我就想:那它們的變數大小是不是也擴充了,那是不是也導致所處的結構體的變數的大小也改變了呢?
因此,我查了下書。找到了答案:總結一下,簡單來說就是,這些動態可變更儲存長度的類都是使用指標,附加動態申請記憶體實現的。而動態申請的記憶體本身並不包含在物件的本身大小上面,在物件中儲存一個指標,它能夠找到動態申請的記憶體的地址。所以,你不管動態申請多少記憶體,它物件中的一個指標總能找得到你,它指標的大小不會發生改變。也就是說,它所在的結構體變數的大小也是不會改變的!
我也寫了一個小程式檢查了一下,大家可以通過執行結果看到結構體變數的大小並沒有改變!
源程式:
#include <iostream> #include <string> #include <vector> using namespace std; typedef struct Vec { vector<int> int_vec; }Int_vec; typedef struct Str { string str; }Str_string; int main(void) { Int_vec myInt; Str_string myString; cout << "空的 myInt 大小:" << sizeof(myInt) << endl << endl; cout << "空的 myString 大小:" << sizeof(myString) << endl << endl; for (int i = 0; i < 10;i++) { myInt.int_vec.push_back(i); } myString.str = "student"; cout << "有十個元素的 myInt 大小:" << sizeof(myInt) << endl << endl; cout << "有字串內容的 myString 大小:" << sizeof(myString) << endl << endl; return 0; }
執行截圖: