2010-11-29 84 views
3

我有以下功能:我可以傳遞給函數的最大字符串長度(或大小)是多少?

int Foo(string sentence); 

我想知道什麼是最大字符串長度我能過去嗎? 我認爲它應該取決於分配給該函數的堆棧大小,因爲這個字符串將被複制到堆棧,這是真的嗎?或者它取決於string :: max_size的值? 我在VS2010下使用C++,windows7

+0

是string :: max_size一個真實的東西? – sje397 2010-11-29 13:28:27

+0

是你唯一可以依賴的東西。 – Simone 2010-11-29 13:36:35

+2

請注意,[通常你應該採取字符串參數每`const`參考](http://stackoverflow.com/questions/2139224/2139254#2139254)。 – sbi 2010-11-29 13:43:20

回答

6

std::string對象將被複制到堆棧,但字符串主體不會 - 它將被分配在堆上。實際的限制將取決於系統和程序內存的使用情況,並且可以是32位系統上的一千萬到十億個字符之類的東西。

2

它與堆棧大小沒有任何關係 - 字符串內容被分配在堆上。所以它取決於string :: max_size或你的計算機有多少RAM /虛擬內存。

0

它永遠不會超過string::max_size,因爲它會返回實現支持的最大長度。

如果它也依賴於像堆棧大小這樣的依賴於運行時的東西,那麼您可能無法找到答案。不用說,最好將(長)字符串作爲常量引用傳遞,以避免任何複製。

1

您可以檢查std::stringmax_size()成員函數。

編輯

如果你的標準庫實現不執行寫時複製的優化,你應當經常引用大串。如果你想獨立於STL,也是如此。

0

它不能超過max_size()這是依賴於實現。

然而,最好的做法是將參考傳遞給它。

int Foo(string& sentence); 
1

它更可能是最大字符串長度會被你的系統比max_size返回的理論最大值的約束來確定。 max_size on Windows 32-bit is 4 GB,但是你將永遠無法在32位Windows盒子上構建一個尺寸在現實世界中的字符串。

您可以在任何特定時刻使用的最大大小會有所不同,並且很可能(在考慮到string的對象大小後)與當時可能的最大連續堆分配相同。這受機器配置(多少RAM,多少內核預留空間,多少其他程序及其內存配置文件)的影響。如果你嘗試去做任何需要堆內存的東西,你會得到一種或另一種類型的異常。首先,您最好不要接近這種情況。

相關問題