jurhas Ответов: 3

Динамической фрагментации памяти с


Несмотря на проблемы с производительностью, в настоящее время я не использую арифметику указателей в блоке памяти, выделяемом динамически.:
int* foo =malloc(sizeof(int)*100);
     *(foo+1)=100; //I do not use this form
     foo[1]=100;//but this

это потому, что я боюсь возможной фрагментации памяти. Что хаотично может раздавить и поднять печально известного СИГСЕВА.
Но оправданы ли мои опасения? Могу ли я использовать арифметику указателей с выделенной памятью?

Что я уже пробовал:

Я не могу попробовать, так как проблема возникает из-за того, как программа выделила память

3 Ответов

Рейтинг:
28

Jochen Arndt

Между этими методами нет никакой разницы. Компилятор обычно генерирует один и тот же ассемблерный код для обоих методов.

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

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

Если у вас есть ошибки сегментации, вы должны проверить и отладить свой код, чтобы найти источник.


Sergey Alexandrovich Kryukov

Исследователь никогда не упоминал о недостатке сегментации. Речь шла о фрагментации, а это совсем другое. Фрагментация не связана с доступом к памяти; она происходит в результате распределения и освобождения.
—СА

Jochen Arndt

Цитата:
- Что хаотично может раздавить и поднять печально известного СИГСЕВА."

Я также попытался объяснить, что фрагментация не связана с доступом к памяти в моем 2-м абзаце.

Я просто попытался "вчитаться" в его вопрос и ответить на все упомянутые аспекты.

Sergey Alexandrovich Kryukov

А, ну да. Я понимаю вашу точку зрения.
—СА

Рейтинг:
1

OriginalGriff

- Но оправданы ли мои опасения?"
Нет, даже чуть-чуть!
Фрагментация памяти не вызвана тем, как вы получаете доступ к памяти, она вызвана выделением и освобождением кусков памяти таким образом, что появляется множество меньших, бесполезных дыр, которые не могут быть повторно использованы как "больший кусок", потому что они не являются смежными.
Здесь есть хорошее описание: Библиотека разработчиков & amp; raquo; фрагментация памяти, ваш худший кошмар[^]- и в нем есть картинки, без которых очень, очень трудно объяснить, что происходит!

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


Рейтинг:
0

Richard MacCutchan

Нет, ваши опасения не оправданы. Не имеет значения, используете ли вы *(foo+1) или foo[1], они оба приводят к точно такому же объектному коду.