NSNumbers занимают меньше памяти, чем int? - PullRequest
2 голосов
/ 28 июля 2011

Я все еще большой новичок, очень весело изучаю основы Objective-C, использую XCode, чтобы собрать несколько простых программ для OS-X.

У меня есть программа, которая оценивает пятикарточную покерную комбинацию.

Каждая карта в колоде идентифицируется по своему уникальному «порядковому номеру» (0-51)

Чтобы ускорить работу оценщика, я подумал, что было бы полезно иметь массив, содержащий все возможные комбинации из пяти индексов (их 2598960).

Если я сделаю это:

    NSMutableArray *allPossibleHands = [[NSMutableArray alloc] initWithObjects: nil];

    for(int i = 0; i<48; i++)
    {
        for(int j = i+1; j<49; j++)
        {
            for(int k = j+1; k<50; k++)
            {
                for(int m = k+1; m<51; m++)
                {
                    for(int n = m+1; n<52; n++)
                    {
                        NSNumber *number0 = [NSNumber numberWithInt: i];
                        NSNumber *number1 = [NSNumber numberWithInt: j];
                        NSNumber *number2 = [NSNumber numberWithInt: k];
                        NSNumber *number3 = [NSNumber numberWithInt: m];
                        NSNumber *number4 = [NSNumber numberWithInt: n];

                        NSArray *nextCombination = [[NSArray alloc] initWithObjects: number0,number1,number2,number3,number4,nil];
                        [allPossibleHands addObject: nextCombination];
                    }
                }
            }
        }
    }

    NSLog(@"finished building allPossibleHands. It contains %i objects", [allPossibleHands count]

);

кажется, все работает нормально, и я получаю сообщение о том, что мой массив содержит, как и ожидалось, 2598960 объектов. Затем я могу перечислить все элементы моего массива.

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

Однако, если вместо построения моего массива, как указано выше, я делаю это:

`short int allPossibleHands[2598960][5]`;

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

Так почему же я могу хранить все эти объекты NSNumber, но не целые?

Есть ли какое-то правило о построении массива, которое я нарушаю?

Как всегда, любое руководство высоко ценится.

Спасибо, что прочитали это.

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

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

Это не значит, что первый занимает меньше места. Если вы выделите второй массив в качестве указателя, ошибка исчезнет.

Также прочитайте ответы на этот вопрос .

1 голос
/ 28 июля 2011

Предполагая, что объект NSNumber должен хранить значение и тип числа, он, вероятно, немного больше, чем int.

Но если ваш массив int [] [] является локальной переменной, он, скорее всего, хранится в стеке, и большинство стеков не такие большие. Вы можете использовать указатель на такой массив и размещать его в куче, которая, вероятно, имеет достаточно места для него.

Доступ к массиву C, скорее всего, немного быстрее, чем доступ ко множеству NSNumbers в NSArray и извлечение их значений, и если это для карточной игры, скорость, вероятно, является проблемой.

1 голос
/ 28 июля 2011

Я думаю, проблема в том, где вы храните свой массив. Это в стеке? Если это так, имейте в виду, что это будет 25 МБ, что намного больше, чем позволяет большинство стеков.

...