C++string類型字串的儲存方式

來源:互聯網
上載者:User

不知道你們有沒有看過string類型變數的成員資料,在string變數中好像真正儲存字串的是一個叫_Ptr的指標,它指向string所儲存的字串首地址。當string變數被定義時,如果未初始化,_Ptr就是一個指向NULL的指標,而且_Ptr看起來像一個const char*類型的指標,如果它是一個空串,你無法使用str[0]='w'這樣的指派陳述式(假設str為string類型)。

問題如下:

1)當我們向string變數賦值時,它是通過動態分配記憶體給_Ptr來儲存字串,還是通過其他的什麼方式來儲存字串的?

2)如果說是通過其他方式來儲存字串,那麼系統到底為string變數提供了多大的儲存空間?

3)這個儲存空間是位於堆上還是位於棧上?如果定義了較多的string變數,會不會佔用過多的儲存空間,造成儲存空間的極大浪費?


結果如下:
 
char* ptr; // 記憶體指標, 用來儲存字串
size_t cap; // 動態記憶體的長度
size_t len; // 字串的長度
實際的實現會更加複雜, 而且是模板.
 
賦值的時候
先檢查 ptr是不是 null, 如果是的話分配足夠的動態記憶體.
如果ptr不是null, 那麼檢查cap是否足夠放下字串, 如果不足的話重新分配記憶體.然後調用std::copy或者strcpy之類的函數, 把字串複製到ptr中.
 
(1)它是通過動態分配記憶體給_Ptr來儲存字串,還是通過其他的什麼方式來儲存字串的?
動態記憶體.
 
(2)系統到底為string變數提供了多大的儲存空間?
這個要看具體的實現定義, 不同的實現之間並不一樣, 不過通常來講, 只會分配必要的記憶體,也就是"asdf"這樣的字串只會分配5個char.
 
(3)這個儲存空間是位於堆上還是位於棧上?

 
(4)如果定義了較多的string變數,會不會佔用過多的儲存空間,造成儲存空間的極大浪費?
不會, string和vector不一樣, 一般不會為元素預留記憶體, 不存在浪費.

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.