Есть ли в пулах автоматического выпуска свои собственные блоки памяти для быстрого освобождения? - PullRequest
0 голосов
/ 21 января 2012

Люди говорят, что авто-релизные пулы быстро освобождают автоматически выпущенные объекты. Но есть два вида автоматически выпущенных объектов:

  1. Те, которые автоматически выпущены после init, например [[NSString alloc] init] autorelease]
  2. Те, которые автоматически выпущены во время создания, например NSString stringWithFormat.

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

В любом случае, есть ли в пулах автоматического выпуска свои собственные блоки памяти для быстрого удаления некоторых объектов?

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Удобно, это с открытым исходным кодом! Проверьте http://www.opensource.apple.com/source/objc4/objc4-493.9/,, в частности objc-arr.mm (для таких вещей, как _objc_rootAlloc, через который проходит + alloc), и оттуда вы можете увидеть следующий комментарий:

/* Autorelease pool implementation
A thread's autorelease pool is a stack of pointers. 
Each pointer is either an object to release, or POOL_SENTINEL which is 
  an autorelease pool boundary.
A pool token is a pointer to the POOL_SENTINEL for that pool. When 
  the pool is popped, every object hotter than the sentinel is released.
The stack is divided into a doubly-linked list of pages. Pages are added 
  and deleted as necessary. 
Thread-local storage points to the hot page, where newly autoreleased 
  objects are stored. 
*/

Чтобы прямо ответить на ваш вопрос, нет, никаких подобных трюков не сделано. Пулы автоматического выпуска просто управляют указателями эффективно, а не хранят объекты.

3 голосов
/ 21 января 2012

Никто не может сказать это точно (только инженер Apple, который будет уволен после утечки этой информации), но если вы посмотрите на альтернативные решения / реализации Foundation, например, GNUstep, вы увидите, что «второйТип автоматически высвобождаемых объектов создается следующим образом:

+ (NSString *) stringWithString:(NSString *)otherString
{
    return [[[self alloc] initWithString:otherString] autorelease];
}

Однако пулы автоматического освобождения по-прежнему могут реализовывать свои собственные методы для быстрого освобождения объектов.Вы можете, еще раз, взглянуть на NSAutoreleasePool.m GNUstep, чтобы узнать, что именно он делает.

Мне также кажется, что вы не уверены, является ли id или нетуказатель. Это .

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