一些可變長度對象(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;
}


運行截圖:

      

發佈了51 篇原創文章 · 獲贊 55 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章