В документации для max_size говорится, что функция должна возвращать "максимально теоретически возможное значение n, для которого вызов allocate (n, 0) может быть успешным", где n - количество объектов.
Контейнеры STL (например, - std :: vector, std :: map или std :: list) используют max_size для вычисления размера контейнера с точки зрения количества объектов, а не количества байтов.Поэтому max_size () не должна возвращать количество байтов, доступных в операционной системе, а использовать количество доступных байтов для вычисления количества объектов, которые может содержать распределитель.
Если вы написали класс распределителя для STLконтейнеры, вы можете реализовать функцию max_size (), чтобы обеспечить точное количество объектов вместо переоценки, используя std::numeric_limits<size_type>::max()
.
size_type max_size() const
{
const unsigned long long bytesAvailable = GetTotalAvailableMemory();
const unsigned long long maxPossibleObjects = bytesAvailable / sizeof(value_type);
return maxPossibleObjects;
}
. Вы можете реализовать GetTotalAvailableMemory () как эти функции в зависимости отваша операционная система.Либо вернет количество нераспределенных байтов, которое может использовать процесс программы.
#if defined(unix) || defined(__unix__) || defined(__unix)
#include <unistd.h>
unsigned long long GetTotalAvailableMemory()
{
const long pageCount = sysconf( _SC_PHYS_PAGES );
const long pageSize = sysconf( _SC_PAGE_SIZE );
const unsigned long long totalBytes = pageCount * pageSize;
return totalBytes;
}
#endif
#if defined(_WIN64) || defined(_WIN64)
#include <windows.h>
unsigned long long GetTotalAvailableMemory()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof( status );
GlobalMemoryStatusEx( &status );
return status.ullAvailVirtual;
}
#endif