個人主頁:Lei寶啊?
愿所有美好如期而遇
說明?
博主是x86平臺,所以下面的結果是28;x64平臺下是40,size_t變了,由int變long long。
接下來我們先來介紹 vs 下string的數據結構
我們可以看到有一個_Buf數組,這個數組的大小為16個字節,但是存有效元素個數為15,最后一位存\0,以及char*,int size,int capacity,共12字節,所以我們計算下來總28字節。
g++下為什么是8個字節呢?首先,linux下默認是64平臺,所以我們也就知道其實這是個指針,他不存大小的空間嗎?我們來看:
我們發現是存的,也就是說存在size和capacity去記錄大小,那么他們在哪里呢?
那么什么是引用計數呢??我們在拷貝stack或者string時,會發生深拷貝,但是如果我們采用淺拷貝,那么就會是這樣:
那么當a和b析構時,這一塊空間會被析構兩次,程序也就崩了,所以引用計數就用在這里,g++下就是淺拷貝,這塊空間每被引用一次,引用計數+1,當析構時,引用計數不為1,就減減,當他為1時,析構釋放這塊空間。
那么也許你會問,共用一塊空間,那如果a要寫入數據,b不就被影響了嗎?所以此時會發生寫時拷貝,誰寫入數據,操作系統就會為其分配一塊新的空間,并使指針指向新的空間,將舊數據拷貝過來。
這樣做意義是什么呢?這樣做是在賭,賭你不寫入數據,只讀,這樣就省下資源了,就算要寫入,最多也就是之前的樣子,穩賺不賠。
本篇講解就到這里了。