iPhone Objective-C не может использовать «новый», чтобы выделить? - PullRequest
1 голос
/ 11 июля 2010

Я создаю программу Game of Life для iPhone и хочу иметь возможность сохранять предыдущие состояния игры в большом массиве, если я использую подход C, и каждая "Сетка" представляет собой структуру, состоящую из двухцелые числа для X, Y и массива BOOL , где я размещаю память пропорционально X Y, умноженному на размер значения BOOL. Я могу создать 1000 из этих «сеток» с разрешением 1024x768 примерно за 0,014 секунды.но когда я создаю класс типа Objective C, который копирует эту структуру, это займет 0,037 секунды.Поэтому, поскольку я хочу максимально ускорить это, но все же сделать код переносимым, максимально соблюдая Obj-C, я спрашиваю, есть ли способ распределить данные быстрее, я пробовал новый, но не могупонять, почему Obj-C не поддерживает его!

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 11 июля 2010

'new' - это C ++, а не цель C. Вы можете переименовать ваши файлы .m в .mm, чтобы они были скомпилированы в режиме target-C ++ для поддержки 'new', но если malloc () не был достаточно быстрым для вас Тогда я сомневаюсь, что новое поможет тебе лучше.

2 голосов
/ 11 июля 2010

Священный вопрос, бэтмен, в следующий раз попробуй использовать пунктуацию и пробел!

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

Теперь, пытаясь разобрать ваш вопрос, это звучит так:

  • вы пытались создать 1000 BOOL * с, позвонив malloc() 1000 раз?

  • ... и вы пришли к выводу, что относительно медленное выделение 1000 объектов является проблемой?

Здесь есть более фундаментальная архитектурная проблема. А именно, что вы пытаетесь смоделировать до такого мелкозернистого уровня с отдельными выделениями, независимо от того, являются ли они BOOL * s, объекты Objective-C являются чем-то еще.

Минимальный размер выделения, который возвращает malloc(), обычно составляет 16 байтов. Этот однобитовый BOOL (на самом деле это 8-битный тип; нет выделения одного бита) займет в 16 раз больше памяти, чем должен.

Вам лучше смоделировать вашу Grid как отдельный экземпляр класса Grid, который содержит все данные. Если вам нужна сетка 10х10 с флагом в каждой точке, просто myBools = malloc(sizeof(BOOL) * 10 * 10). Затем любой BOOL может быть извлечен с помощью myBools[col + (row * 10)], то есть тривиально отобразить 2D (или 3D) сетку ганка в линейный массив.

0 голосов
/ 11 июля 2010

Я думаю, вы должны вместо вызова malloc () 1000 раз вызывать его один раз, а затем устанавливать указатели в блок памяти.Это должно быть еще быстрее.Однако я не думаю, что, учитывая, быстрее ли new или malloc быстрее, изменение алгоритма обычно в 10 раз эффективнее.

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