Вы когда-нибудь использовали NSZoneMalloc () вместо malloc ()? - PullRequest
3 голосов
/ 27 февраля 2009

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

Предположим, вам нужно выделить блок памяти (не для объекта, а для произвольных данных). Если вы наберете malloc(size), буфер всегда будет выделен в зоне по умолчанию. Однако кто-то, возможно, использовал allocWithZone: для размещения вашего объекта в другой зоне, кроме стандартной. В этом случае было бы лучше использовать NSZoneMalloc([self zone], size), который хранит ваш буфер и объект-владелец в одной и той же области памяти.

Ты следуешь этой практике? Вы когда-нибудь использовали зоны памяти?

Обновление: я думаю, что в Stack Overflow существует тенденция отвечать на вопросы по низкоуровневым темам с помощью лекции о преждевременной оптимизации. Я понимаю, что зоны, вероятно, имели большее значение в 1993 году на оборудовании NeXT, чем сегодня, и поиск в Google показывает, что практически никто не заинтересован в них. В любом случае я прошу посмотреть, может ли кто-нибудь описать проект, в котором он использовал зоны памяти.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2009

Я написал программное обеспечение для NeXTStep, GNUstep для Linux и Cocoa для Mac OS X, и мне никогда не приходилось использовать пользовательские зоны памяти. Условие, которое может послужить хорошим улучшением программного обеспечения, никогда не возникало или никогда не определялось как существенное.

1 голос
/ 27 февраля 2009

Вы абсолютно правы во всем вопросе, но на практике никто на самом деле не использует зоны. Как показывает страница, на которую вы ссылаетесь:

В большинстве случаев использование зоны по умолчанию быстрее и эффективнее, чем создание отдельной зоны.

Преимущество создания собственной зоны:

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

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

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

0 голосов
/ 27 февраля 2009

Если вы обнаружите, что делаете это, вы, вероятно, работаете на более низком уровне, чем на самом деле должны быть. Подсистема в значительной степени игнорирует их; любые вызовы +alloc или тому подобное приведут вас к объектам в зоне по умолчанию. malloc и NSAllocateCollectable - это все, что вам нужно знать.

...