最近我注意到,以下语句不适用于std::string s
。
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
,那为什么不试试呢?
这更多的是好奇心,我只是想知道为什么至少在这个实现中两者被单独定义。
max_size()
都有可能失败,因为它取决于外部变量(堆中有多少可用空间)。 - Evan Teran