как добавить пробел между двумя текстами в диалоговом окне оповещения [закрыто]

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

Один типичный способ (в строке) состоит в том, чтобы фактически распределять как заголовок, так и память вы просили, добрались до минимального размера. Например, если вы запросили 20 байтов, система может выделить 48-байтовый блок:

  • 16-байтовый заголовок, содержащий размер, специальный маркер, контрольную сумму, указатели на следующий / предыдущий блок и и т. д.
  • 32 байта области данных (ваши 20 байт заполнены до кратного 16).

Адрес, указанный вами, является адресом данных площадь. Затем, когда вы освободите блок, free просто возьмет адрес, который вы ему даете, и, предположив, что вы не наполнили этот адрес или память вокруг него, проверьте учетную информацию непосредственно перед этим. Графически это будет выглядеть так:

 ____ The allocated block ____
/                             \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
          ^
          |
          +-- The address you are given

Имейте в виду, что размер заголовка и отступов полностью определяется реализацией (на самом деле, все это определяется реализацией (a), но встроенный учетный параметр является общим).

Контрольные суммы и специальные маркеры, которые существуют в учетной информации, часто являются причиной ошибок, таких как «Memory arena corrupted» или «Double free», если вы перезаписываете их или освободить их дважды.

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


(a) Я написал реализации malloc во встроенных системах, где вы получили 128 байты независимо от того, что вы просили (это был размер самой большой структуры в системе), если вы попросили 128 байт или меньше (запросы на большее должно быть выполнено с возвратным значением NULL). Очень простая битовая маска (т. Е. Не в строке) использовалась для определения того, был ли выделен 128-байтовый кусок.

Другие, которые я разработал, имели разные пулы для 16-байтовых фрагментов, 64-байтовые фрагменты, 256-байтовые фрагменты и 1K-фрагменты, снова используя битовую маску для определения того, какие блоки были использованы или доступны.

Обеим этим опциям удалось уменьшить накладные расходы бухгалтерской информации и увеличить скорость malloc и free (нет необходимости объединять соседние блоки при освобождении), что особенно важно в среде, в которой мы работали.

-8
задан Richardo Luis 3 December 2012 в 07:23
поделиться