size_t
должен быть достаточно большим, чтобы хранить как можно больший единственный смежный объект.То, что может не совпадать с размером адресного пространства (например, в системах с моделью сегментированной памяти)
Однако на общих платформах с плоским пространством памяти дваравны, и поэтому вы можете с легкостью использовать size_t
на практике, если знаете целевой процессор.
В любом случае, это действительно не говорит вам ничего полезного.Конечно, 32-разрядный процессор имеет 4 ГБ памяти, поэтому size_t
- это 32-разрядное целое число без знака.Но это ничего не говорит о том, сколько вы можете выделить.Некоторая часть пространства памяти используется ОС.А некоторые части уже используются вашим собственным приложением: для отображения исполняемого файла в память (а также любые динамические библиотеки, которые он может использовать), для стека каждого потока, выделенной памяти в куче и т. Д.
Итакнет, такие уловки, как взятие размера size_t
, немного расскажут вам об адресном пространстве, в котором вы работаете, но ничего очень полезного.Вы можете спросить у ОС, сколько памяти используется вашим процессом и другими показателями, но опять же, это не очень вам помогает.Процесс может использовать всего пару мегабайт, но он распределен по стольким небольшим выделениям, что невозможно найти непрерывный блок памяти размером более 100 МБ, скажем.Итак, на 32-разрядной машине с процессом, который почти не использует память, вы вряд ли будете делать такое распределение.(И даже если бы у ОС был волшебный WhatIsTheLargestPossibleMemoryAllocationICanMake()
API, этот все же не помог бы вам. Он бы сказал вам, что вам нужно с момента назад . У вас нет гарантиичто ответ все равно будет действительным к тому времени, когда вы попытаетесь сопоставить файл.
На самом деле лучшее, что вы можете сделать, это попытаться сопоставить файл и посмотреть, не получится ли это.