最近我已經注意到下面的語句不是真的給出std::string s
。爲什麼不是std :: string :: max_size()== std :: string :: allocator :: max_size()
s.max_size() == s.get_allocator().max_size();
我發現這個有趣的,默認情況下std::string
將使用std::allocator<char>
其中有size_type(-1)
一個理論極限(是的,我知道我假設2的補,但這是無關的實際問題)。我知道實際的限制會比這少很多。在一個典型的32位x86系統上,內核將佔用2GB(可能是1GB)的地址空間,實際上限要小得多。
無論如何,GNU libstdC++的std::basic_string<>::max_size()
似乎返回相同的值,無論它使用的分配器說什麼(類似於1073741820
)。
那麼問題依然存在,爲什麼std::basic_string<>::max_size()
只是返回get_allocator().max_size()
?在我看來,這是假設的上限。如果分配不足,它只會拋出一個std::bad_alloc
,所以爲什麼不嘗試?
這比其他任何事情都好奇,我只是想知道爲什麼兩個至少在這一個實現分開定義。
「如果。分配不足,它只會拋出一個std :: bad_alloc,所以爲什麼不嘗試?「我可以爲你解答。人們可能需要處理大型字符串,並將其拆分爲大字符串塊,如果他們實際上不能依賴於max_size向他們報告什麼,他們將不得不求助於臨時限制。 – GManNickG
我明白你的觀點,但我不同意。實際情況是,你總是必須假定任何字符串大小<='max_size()'都有可能失敗,因爲它依賴於一個外部變量(堆中有多少可用)。 –
同意。我唯一的一點是,他們至少應該努力做到準確,不要只是給出一個大數字,並希望最好。給實際的數字帶來最好的希望。 :)但棘手的問題。 – GManNickG