Objective c 可以使用堆栈变量优化目标c调用吗?

Objective c 可以使用堆栈变量优化目标c调用吗?,objective-c,optimization,memory-management,stack,Objective C,Optimization,Memory Management,Stack,我是否遗漏了什么,或者要调用sendData,我真的需要像这样在堆上创建3ns对象吗?或者这甚至是在堆上创建的?是否仍需要在堆栈上创建它们?这似乎效率低下 NSData *data = [NSData dataWithBytes:packet->data length:packet->dataLength]; if(!data) return -5; NSString *player = [NSString initWithCString:(char*)peer->da

我是否遗漏了什么,或者要调用sendData,我真的需要像这样在堆上创建3ns对象吗?或者这甚至是在堆上创建的?是否仍需要在堆栈上创建它们?这似乎效率低下

NSData *data = [NSData dataWithBytes:packet->data length:packet->dataLength];
if(!data)
    return -5;
NSString *player = [NSString initWithCString:(char*)peer->data encoding:NSASCIIStringEncoding];
if(!player)
    return -6;
NSArray *to = [NSArray arrayWithObject:player];
if(!to)
    return -7;

NSError *error;
BOOL success = [[GCHelper sharedInstance].match sendData:data toPlayers:to withDataMode:GKMatchSendDataReliable error:&error];
if (!success) {
    printf("Error sending packet %08x %d\n", packet->data, packet->dataLength);
    return -8;
}
我能做点像这样的事吗

NSData data;
[data dataWithBytes:packet->data length:packet->dataLength];
NSString player;
[player initWithCString:(char*)peer->data encoding:NSASCIIStringEncoding];
NSArray to;
[to arrayWithObject:player];
对不起,我对C++很精通,但对Objul-C.< 我能做点像这样的事吗

NSData data;
[data dataWithBytes:packet->data length:packet->dataLength];
NSString player;
[player initWithCString:(char*)peer->data encoding:NSASCIIStringEncoding];
NSArray to;
[to arrayWithObject:player];
没有。除了
-init
和friends没有实际初始化之外(看看NSObject.mm,它所做的只是
返回self;
),这些调用只发送了nil消息
+alloc
仅用于提供独立于实现的分配器功能;在堆上分配对象的方法。如果您担心Objective-C本身的性能,那么您不必使用它。你可以随时回到C和C++,回到你知道和喜欢的堆栈分配变量和复杂指针算法的领域。Objective-C仍然是一种性能良好的语言,尽管它“效率低下”

虽然C和C++是为嵌入式系统和任务关键应用程序设计的,其中内存和处理器效率是王,但Obje-C设计成在相当一致、性能良好、内存相对较硬的硬件上运行。正如您在回答我对这个问题的评论时正确指出的那样,不幸的是,您不能添加自己的方法,该方法在调用框架时将数据作为C指针。但是,您可以在一个级别上执行类似的操作,您可以创建
NSData
NSString
,而无需将数据本身复制到堆中:

NSData *data = [NSData dataWithBytesNoCopy:packet->data
                                    length:packet->dataLength
                              freeWhenDone:NO];
if(!data)
   return -5;

NSString *player = [NSString initWithBytesNoCopy:peer->data
                                          length:strlen(peer->data)
                                        encoding:NSASCIIStringEncoding
                                    freeWhenDone:NO];
if(!player)
   return -6;

NSError *error;
BOOL success = [[GCHelper sharedInstance].match sendData:data
                                               toPlayers:@[player] // array expression
                                            withDataMode:GKMatchSendDataReliable
                                                   error:&error];
if (!success)
{
   printf("Error sending packet %08x %d\n", packet->data, packet->dataLength);
   return -8;
}
这仍然将您的数据包装为堆对象,但并不是
NSData
NSString
堆对象都直接引用您的数据。当然,你必须确保你的数据在需要的时候保持有效


注意:如果你进入Objto-C,并且经常需要这个功能,那么你可以把上面的代码打包成一个类别:<代码> gkMatx——这是一个练习:-)/P>所以我可以创建一个C++ NStask、NScand和NSArray,并把它们传递给sDeDATA?你知道那些C++变体是什么吗?没有C++变体,即使你制作了它们,把它们连接到Objto-C对象也很痛苦。谢谢。因此,要进行此sendData调用,必须有6个内存分配和对失败内存的检查?3表示对象,1表示数据,1表示播放器字符串,1表示NSArray中的元素。很抱歉,如果这不是低效的,我不知道什么是lol。更不用说真正做任何事情的唯一分配是数据分配,其他分配只是API桥接平衡。顺便说一句,是的,这是过早的优化,也许不会有什么区别,(在3gs移动cpu上?),但因为我在学习Objective-C,我想知道是否有更好的方法来实现它。@Rasterman问题是,你认为语言的设计本身效率低下(这肯定是与其他语言相比的,我不这么认为),除了写一门更好的语言或者学习低水平之外,没有办法补救。直到你教育我,我才知道这一点,所以谢谢你。一个相关的问题是,是否需要对if(!data)if(!player)等进行分配检查?这些对象是动态分配的,可能无法正确分配?正如CodaFi指出的,您渴望C++的堆栈分配对象(在某些情况下具有优势,但在其他一些情况下也会从根本上被破坏,除非标准已被修正-您可以,或者可能最终使用错误vtables的对象,但我离题了)。如果这不是过早的优化,您可以通过在任何类上声明一个方法来解决此问题。

GCHelper.sharedInstance.match
直接获取您的
char*
等,并从中构造数据包,而无需将其包装和展开为堆对象。HTH.sendData是一个GameKit API调用,不是不可能要按照您的建议声明另一个函数?不幸的是,如果您要调用框架,您需要另一个解决方案。在这里写的时间太长了,我添加了一个答案。现在这看起来有点意义了,谢谢!但有一些问题:1)您不认为sendData会复制提供的数据吗,因为它必须缓冲数据并发送数据,如果是这样的话,它会不会简单地添加所提供的已分配NSData对象并保留它?2) 数组表达式是否仍然分配NSArray对象并将其放在堆中,这只是一种更简洁的方法?它提供的唯一好处是数据不会被复制到堆中。您仍然无法在堆栈上分配对象。@CodaFi-准确地说,但这里重要的是“仅”的度量值-如果性能是一个问题,删除冗余缓冲区副本可能很重要。@Rasterman(1)如果数据在返回之前未被
sendData
使用,则您不想使用
…NoCopy
或堆栈分配对象(如在C++中),否则您会遇到麻烦!在这种情况下,您可能希望将
…NoCopy
freewwhendone:YES
-一起使用,这需要一个
malloc
”块,它将释放该块(您没有给出结构的原点,所以我不能说这是否合适)。(2) 数组表达式仍然分配一个heap对象,只是更简洁而已。注意,分配是Obj-C通常是便宜的,但当然是YMMV。