LinuxForum.Fans
Тема

Вопрос по оператору new в х86

Автор: Aether 10 сообщений 1492 просмотров
15.02.2015 10:07 #414323

Доброго дня.

Вопрос: как на физическом уровне работает выделение памяти через оператор new? Интерес, собственно, вот в чём: когда я выделяю массив, скажем, 5 байт, то new всё равно запрашивает у системы 4Кб (целую страницу) или пытается как-то упаковать несколько видов данных в одну страницу, если умещаются?

Был бы рад совету на чтение какой-нибудь литературы.

15.02.2015 10:15 #414324

new только выделяет участок, кратный размеру страницы.
А размещать в нём разные данные, для экономии памяти, должны вы сами.

Пётр.

15.02.2015 11:39 #414331

Хорошо.

А как ведётся учёт страниц, применительно к linux?

То есть, скажем, я выделяю участок:

int* a = new int[7000]

стало быть система берёт размерность int умножает на 7000 - получает число байт. Затем делит на 4096 и округляет до большего - получает число страниц. Запрашивает у ядра страницы, оно выделяет. Далее:
...
delete a

Теперь их надо освободить, я полагаю, new должен создать некую структуру учёта выделенных страниц, так как он это делает, и что более интересно: где её располагает? В выделенном участке?

15.02.2015 16:32 #414351

не смешивайте - после того, как приложение запросило память у системы, там ещё работает целый слой, управляющей динамической памятью внутри приложения.

15.02.2015 18:06 #414368

Так вот мне и хочется разобраться, как это происходит конкретно.

15.02.2015 20:41 #414406
Aether написал:
Так вот мне и хочется разобраться, как это происходит конкретно.

Проблемному программисту это не нужно. Это надо знать системному программисту,
т.к. он работает на уровне операционной системы и он и занимается такими вопросами.
Считайте, что вам доступна вся выделенная память.

Пётр.

15.02.2015 21:07 · отредактировано #414410

Это ответ, но не на мой вопрос. Мне интересен именно механизм работы, думаю, не системным программистам тоже это будет интересно.

Peter написал:
Проблемному программисту это не нужно.

Это вывод из несоблюдения мною синтаксиса delete[] a ?

16.02.2015 13:15 #414487
Aether написал:
Это ответ, но не на мой вопрос. Мне интересен именно механизм работы, думаю, не системным программистам тоже это будет интересно.

Это вывод из несоблюдения мною синтаксиса delete[] a ?

man malloc, и потом переходите по ссылкам, попадающимся там
Ещё можно третий том Кнута почитать.
Но вообще за всем этим спрятан весьма непростой (и капризный) механизм, так что подумайте - так ли сильно это вам надо.
Да - единожды запрошенную у системы память процессы обратно не возвращают, а резервируют для повторного использования.

17.02.2015 09:48 #414562

man почитал, но там не о механизме, а о применении. Кнут том третий - это "Искусство программирования. Сортировки..." - тоже читал, но большее нашёл в томе первом: динамическая память, впрочем, это общая теория.

Вот, например, я объявляю статический указатель на динамический массив указателей, каждый из которых ссылается на некую динамическую структуру. Так вот, если выделять под массив динамических структур разные указатели, то выигрыш получается в простоте опроса этих структур. Но, предположим, что структура имеет размер 200 байт, а выделена будет на каждую структуру страница - 4Кб - тогда потери памяти будут эпические.

Тема, возможно, нудная, но её знать надо.

17.02.2015 20:53 #414638

Вы произносите фразы, смысл которых сомнителен, т.к. вы не владеете терминологией.
Память под массив структур можно отвести и статически и динамически.
Во 2-м случае надо будет, например, также объявить один указатель типа
"указатель на структуру" и установить его на начало этой области,
а к следущим элементам массива обращаться через смещение.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.