我有以下功能:我可以傳遞給函數的最大字符串長度(或大小)是多少?
int Foo(string sentence);
我想知道什麼是最大字符串長度我能過去嗎? 我認爲它應該取決於分配給該函數的堆棧大小,因爲這個字符串將被複制到堆棧,這是真的嗎?或者它取決於string :: max_size的值? 我在VS2010下使用C++,windows7
我有以下功能:我可以傳遞給函數的最大字符串長度(或大小)是多少?
int Foo(string sentence);
我想知道什麼是最大字符串長度我能過去嗎? 我認爲它應該取決於分配給該函數的堆棧大小,因爲這個字符串將被複制到堆棧,這是真的嗎?或者它取決於string :: max_size的值? 我在VS2010下使用C++,windows7
std::string
對象將被複制到堆棧,但字符串主體不會 - 它將被分配在堆上。實際的限制將取決於系統和程序內存的使用情況,並且可以是32位系統上的一千萬到十億個字符之類的東西。
它與堆棧大小沒有任何關係 - 字符串內容被分配在堆上。所以它取決於string :: max_size或你的計算機有多少RAM /虛擬內存。
它永遠不會超過string::max_size
,因爲它會返回實現支持的最大長度。
如果它也依賴於像堆棧大小這樣的依賴於運行時的東西,那麼您可能無法找到答案。不用說,最好將(長)字符串作爲常量引用傳遞,以避免任何複製。
您可以檢查std::string
的max_size()
成員函數。
編輯
如果你的標準庫實現不執行寫時複製的優化,你應當經常引用大串。如果你想獨立於STL,也是如此。
它不能超過max_size()
這是依賴於實現。
然而,最好的做法是將參考傳遞給它。
int Foo(string& sentence);
它更可能是最大字符串長度會被你的系統比max_size
返回的理論最大值的約束來確定。 max_size
on Windows 32-bit is 4 GB,但是你將永遠無法在32位Windows盒子上構建一個尺寸在現實世界中的字符串。
您可以在任何特定時刻使用的最大大小會有所不同,並且很可能(在考慮到string
的對象大小後)與當時可能的最大連續堆分配相同。這受機器配置(多少RAM,多少內核預留空間,多少其他程序及其內存配置文件)的影響。如果你嘗試去做任何需要堆內存的東西,你會得到一種或另一種類型的異常。首先,您最好不要接近這種情況。
是string :: max_size一個真實的東西? – sje397 2010-11-29 13:28:27
是你唯一可以依賴的東西。 – Simone 2010-11-29 13:36:35
請注意,[通常你應該採取字符串參數每`const`參考](http://stackoverflow.com/questions/2139224/2139254#2139254)。 – sbi 2010-11-29 13:43:20