1. 程式人生 > >一些可變長度物件(string物件、vector物件 ...)作為結構體或類的成員,會不會動態改變結構體或類所定義的變數的大小呢?

一些可變長度物件(string物件、vector物件 ...)作為結構體或類的成員,會不會動態改變結構體或類所定義的變數的大小呢?

       可能是我自身的原因,經常性的杞人憂天!

       在接觸到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;
}

執行截圖: