2011-04-08 47 views

回答

8

默認情況下,分配給std::string內存動態分配。

請注意std::string有一個max_size()函數返回實現支持的最大字符數。但是,這樣做的有用性值得懷疑,因爲它是最大的實現,並沒有考慮其他資源,如內存。你真正的限制要低得多。 (嘗試連續內存分配4GB,或考慮到內存耗盡別處。)

+0

啊,我認爲這將是堆棧限制,因爲它看起來像任何其他本地變種。我想任何std ::對象被分配在堆中? – eugene 2011-04-08 06:35:27

+0

@Eugene:不,myVar是堆棧分配的,但它擁有一個內部緩衝區來存儲堆分配的字符串(一般情況下)。 std容器通常需要一個負責分配資源的'Allocator'參數,並且通常在堆上進行分配,儘管它(理論上)可以在堆棧上分配。 – 2011-04-08 06:37:52

+0

@Eugene它依賴,但對於容器,是的,數據通常在堆中。你總是可以將一個分配器拼湊成「使用」堆棧(bleh)。 – Anycorn 2011-04-08 06:39:17

2

std::string對象將同樣的方式被分配一個int或任何其它類型必須是:上,如果它是一個局部變量,或它的堆可能是static,或在哪裏X包含string等如果使用new std::string堆或new X ..

但是,這std::string對象含有至少一個指針,指向由與basic_string的<分配器提供額外的存儲器>被實例化 - 爲std::stringtypedef這意味着堆分配內存。無論是直接在原來的std::string對象存儲或指向的堆,你可以期望找到:

  • 字符串大小成員,
  • 可能引用計數器或鏈接的一些方式,
  • 文本數據串店(如果有的話)

一些std::string實現具有「短字符串」的優化,他們包的只有幾個字符的字符串直接到字符串對象本身(記憶效率,經常使用某種聯盟與當字符串更長時用於其他目的的字段)。但是,對於其他字符串實現,甚至對於那些在處理字符串過長而不能直接適用std :: string對象時進行短字符串優化的用戶,他們將不得不遵循對存儲的文本數據的指針/引用在分配器提供的(堆)內存中。