Доброго дня.
Вопрос: как на физическом уровне работает выделение памяти через оператор new? Интерес, собственно, вот в чём: когда я выделяю массив, скажем, 5 байт, то new всё равно запрашивает у системы 4Кб (целую страницу) или пытается как-то упаковать несколько видов данных в одну страницу, если умещаются?
Был бы рад совету на чтение какой-нибудь литературы.
Вопрос по оператору new в х86
new только выделяет участок, кратный размеру страницы.
А размещать в нём разные данные, для экономии памяти, должны вы сами.
Пётр.
Хорошо.
А как ведётся учёт страниц, применительно к linux?
То есть, скажем, я выделяю участок:
int* a = new int[7000]
стало быть система берёт размерность int умножает на 7000 - получает число байт. Затем делит на 4096 и округляет до большего - получает число страниц. Запрашивает у ядра страницы, оно выделяет. Далее:
...
delete a
Теперь их надо освободить, я полагаю, new должен создать некую структуру учёта выделенных страниц, так как он это делает, и что более интересно: где её располагает? В выделенном участке?
не смешивайте - после того, как приложение запросило память у системы, там ещё работает целый слой, управляющей динамической памятью внутри приложения.
Так вот мне и хочется разобраться, как это происходит конкретно.
Так вот мне и хочется разобраться, как это происходит конкретно.
Проблемному программисту это не нужно. Это надо знать системному программисту,
т.к. он работает на уровне операционной системы и он и занимается такими вопросами.
Считайте, что вам доступна вся выделенная память.
Пётр.
Это ответ, но не на мой вопрос. Мне интересен именно механизм работы, думаю, не системным программистам тоже это будет интересно.
Проблемному программисту это не нужно.
Это вывод из несоблюдения мною синтаксиса delete[] a ?
Это ответ, но не на мой вопрос. Мне интересен именно механизм работы, думаю, не системным программистам тоже это будет интересно.
Это вывод из несоблюдения мною синтаксиса delete[] a ?
man malloc, и потом переходите по ссылкам, попадающимся там
Ещё можно третий том Кнута почитать.
Но вообще за всем этим спрятан весьма непростой (и капризный) механизм, так что подумайте - так ли сильно это вам надо.
Да - единожды запрошенную у системы память процессы обратно не возвращают, а резервируют для повторного использования.
man почитал, но там не о механизме, а о применении. Кнут том третий - это "Искусство программирования. Сортировки..." - тоже читал, но большее нашёл в томе первом: динамическая память, впрочем, это общая теория.
Вот, например, я объявляю статический указатель на динамический массив указателей, каждый из которых ссылается на некую динамическую структуру. Так вот, если выделять под массив динамических структур разные указатели, то выигрыш получается в простоте опроса этих структур. Но, предположим, что структура имеет размер 200 байт, а выделена будет на каждую структуру страница - 4Кб - тогда потери памяти будут эпические.
Тема, возможно, нудная, но её знать надо.
Вы произносите фразы, смысл которых сомнителен, т.к. вы не владеете терминологией.
Память под массив структур можно отвести и статически и динамически.
Во 2-м случае надо будет, например, также объявить один указатель типа
"указатель на структуру" и установить его на начало этой области,
а к следущим элементам массива обращаться через смещение.
Пётр.