Я попробовал следующую программу:
#include <vector>
#include <string>
int main(void)
{
int i;
std::vector<std::string> * vec;
i = vec->max_size();
vec = new std::vector<std::string>;
vec->reserve(i);
delete vec;
return 0;
}
I compiled as follows:
CRTCPPMOD MODULE(TEST) DBGVIEW(*ALL) TERASPACE(*YES *TSIFC) STGMDL(*TERASPACE)
DTAMDL(*LLP64) RTBND(*LLP64)
CRTPGM PGM(TEST) STGMDL(*TERASPACE)
Это показывает, что max_size возвращает 178,956,970, намного большее значение, чем вы видели.
Тем не менее, передача этой функции в Reserve () вызывает sigabort и убивает задание!
Однако мне удалось успешно передать 89000000 в Reserve () (заполнение вектора строками вполне можетоднако вызвать сбой!)
Я не уверен во всех кровавых деталях, но подозреваю, что это в значительной степени связано с реализацией кучи без тераспространства (которая ограничивает непрерывное хранение до 16 МБ) по сравнению с Teraspace, гдеограничение составляет 4 ГБ непрерывно адресуемого выделения.Вы можете поиграть с опциями, которые я указал, чтобы увидеть, что произойдет.
Обратите внимание, я выделил вектор в куче.Вещи могут быть разными для стека или статически распределенного вектора.