繁体   English   中英

NSNumbers比ints占用更少的内存?

[英]NSNumbers taking up less memory than ints?

我仍然是一个菜鸟,通过使用XCode组合一些针对OS-X的简单程序,学习了Objective-C的基础知识非常有趣。

我有一个程序,可将五张扑克牌排名。

卡组中的每张卡均由其唯一的“索引号”(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对象。 然后,我可以列出数组中的所有元素。

但是我认为将int封装在这样的NSNumber对象中必须占用更多内存。 也许将索引号存储为short int会更好。

但是,如果不是像上面那样构建我的数组,而是这样做:

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

然后打算使用我的循环直接存储int,我收到一条EXC_BAD_ACCESS错误消息,并注意到该程序没有可用的内存。

那么我怎么能存储所有这些NSNumber对象,而不是ints?

我要打破一些关于数组构造的规则吗?

与往常一样,任何指导都值得赞赏。

谢谢您阅读此篇。

虽然第二个分配在堆栈上(大小限制更大),但是第一个分配在堆上,并且是指向内存区域的指针。

这并不意味着第一个占用更少的空间。 如果将第二个数组分配为指针,则错误将消失。

另请阅读此问题的答案。

我认为问题在于您存储阵列的位置。 它在堆栈上吗? 如果是这样,请记住它将比大多数堆栈所允许的大25MB。

假设NSNumber对象必须存储数字的值和类型,则它可能比int大一点。

但是,如果您的int [] []数组是局部变量,则很有可能将其存储在堆栈中,并且大多数堆栈不会那么大。 您可以使用指向此类数组的指针,并在堆上对其进行malloc,这可能有足够的空间容纳它。

访问C数组的速度可能要比访问NSArray中的许多NSNumber并提取其值快一点,并且如果这是用于纸牌游戏,则速度可能是个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM