Re[2]: Почему malloc() выделяет 4K минимум?
От: RunderBin Россия  
Дата: 02.03.07 10:42
Оценка:
_W>Да, в Windows гранулярность страниц — 4 килобайта.
_W>Выделив 1 байт, нам windows отдаёт целую страничку. Но если выделить потом ещё один байт, менеджер памяти положит скорее всего его в туже страничку.

Более того, Windows не отслеживает обращение в соседним (невыделенным) ячейкам памяти в рамках страницы (ибо x86 не предоставляет удобного механизма для этого, и даже если это сделать, то получатся тормаза при обращении к памяти и ее перестанут называть оперативной). Напомню что основной механизм защиты памяти большинства ОС для x86 стоиться на основе исключений процессора, которые генерируются на уровне страниц (4Кб/4Мб). Именно от сюда и выплывает гранулярность самой Windows. Вот к примеру взгляните на такой код:

int * pNumber = new int;
pNumber += 100;
*pNumber = 42; // Пишем мусор

исключения не возникают. (хотя у Вас могут возникнуть, ибо я не знаю в каком месте 4 килобайтной страницы Windows положит этот int).
Если прибавить не 100 интов а скажем 5000 или 10000, то скорее всего возникнет исключение (вылезли на несуществующую страницу) и Windows попросит отправить письмо во всем известное место. НО! Когда запуск происходит под отладчиком Visual Studio — размер разрешенного окна сужается до 57 байт (у меня опять же). Она то почти за всем следит Ну .... почти
Люди — ангелы презирающие условности, желающие восстановить друвнейшую связь со звездной динамомашиной в вечности мироздания
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.