Память и указатели - PullRequest
       30

Память и указатели

5 голосов
/ 15 октября 2010

Мне нужна помощь с размышлениями о задаче.

Моя задача - создать одну область памяти

void *memory = malloc(320);

, а затем используйте указатели для хранения текстов в этом месте хранения: мы хотим разделить эту область на блоки данных по 32 байта, поэтому мы можем хранить: 320/32 = 10 блоков данных по 32 байта. В одном блоке данных я могу хранить (1 ASCSII символ = 1 байт) 32 символа.

У меня есть растровое изображение длиной 10, где каждый бит указывает, используется ли блок данных (1) или нет (0).

Но что, если я хочу сохранить текст длиной 60 символов? Тогда мне нужно 2 блока данных (2 х 32 байта). Битовая карта показывает, что блоки данных 2 и 6 свободны, 1 и 6 не расположены рядом. Как мне этого добиться?

struct  data {
    char * text;
};

typedef struct data d;

d->text = ???

Ответы [ 6 ]

4 голосов
/ 15 октября 2010

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

Управляемые языки, такие как C #, которые не допускают указатели (в обычном случае - пожалуйста, не зацикливайтесь на этом), имеютсвобода реорганизовать основную память и исправить эту проблему (хотя это не бесплатно с точки зрения производительности).

Чтобы исправить проблему в C:
Вы не можете многое сделать, потому что эти указатели в памятине дать вам переставить все.Кто-то еще упомянул систему друзей, но есть и другие, но некоторые из них простые.Многие из них основаны на наличии предустановленных «больших чанков» и «маленьких чанков» и разрешении только небольших запросов на маленькие чанки и т. Д., Но это все, чтобы перестать приходить к проблеме с самого начала, как только вы окажетесь там, вы либо отрицаетезапрос памяти или расширение пула.

0 голосов
/ 15 октября 2010

Вы можете получить байт из каждого из 10 32-байтовых пространств и использовать этот байт как указатель на продолжение строки.На самом деле это будет связанный список, и вы можете сделать его дважды связанным списком, имея прямые и обратные индексы.

0 голосов
/ 15 октября 2010

Несколько мыслей в голове:

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

  • Вы можете переписать спецификацию для своей системы хранения, чтобыконкретный байт каждого блока используется для хранения числа, идентифицирующего «следующий» блок (таким образом, имея только 31 байт эффективного хранилища на блок).

0 голосов
/ 15 октября 2010

Ваша структура строковых данных должна быть точно такой же, как ваш менеджер блоков, за исключением того, что она должна отслеживать «локальные» блоки, а не все блоки в пуле памяти.

0 голосов
/ 15 октября 2010

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

0 голосов
/ 15 октября 2010

Как уже упоминалось в других комментариях и ответах, это проблема фрагментации. Вы можете либо выполнить дефрагментацию кода (что налагает множество требований и ограничений на то, как системы могут получить доступ к памяти), либо выделить память.

Существуют методы для минимизации фрагментации. Один из популярных вариантов - выделение памяти для друзей: http://en.wikipedia.org/wiki/Buddy_memory_allocation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...