程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++string類型字符串的存儲方式

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

編輯:C++入門知識

不知道你們有沒有看過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不一樣, 一般不會為元素預留內存, 不存在浪費.


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved