Ios 使用C++-Objective-C-块中的对象

Ios 使用C++-Objective-C-块中的对象,ios,performance,objective-c-blocks,objective-c++,Ios,Performance,Objective C Blocks,Objective C++,我有一个C++对象obj,我想在块中访问它: MyCppClass obj; void(^myBlock)() = ^{ obj.test(); }; 这里的问题是obj被复制到块中,但我想使用对原始对象的引用。我可以用指针代替: MyCppClass obj; MyCppClass *objP = &obj; void(^myBlock)() = ^{ objP->test(); }; 但我认为取消引用指针比使用引用要花更多的时间。(性能至关重要,因为在我的项

我有一个C++对象
obj
,我想在块中访问它:

MyCppClass obj;
void(^myBlock)() = ^{
    obj.test();
};
这里的问题是
obj
被复制到块中,但我想使用对原始对象的引用。我可以用指针代替:

MyCppClass obj;
MyCppClass *objP = &obj;
void(^myBlock)() = ^{
    objP->test();
};

但我认为取消引用指针比使用引用要花更多的时间。(性能至关重要,因为在我的项目中,这样的块是为大图像的每个像素调用的。)


如何访问块内的对象?指针< > >指针指针比函数调用或C++方法调用快,这涉及到在该类中查找方法的几个指针引用,然后实际分配函数的调用,实际上是在堆栈上分配内存,将一些寄存器保存到RAM中,然后当它返回时做相反的操作。所以不要担心这里的性能。如果分析器显示单个指针引用会导致性能问题,则会有更大的问题,您可能会下降到手工编写的汇编程序,而忘记使用C++类或块。而且,这是一件非常罕见的事情

使用指针或C++引用(后者在引擎盖下是相同的,但是在它的脚上用它射击更难,代码更可读)。请记住,如果要在与当前函数相同的函数(或由当前函数调用的函数)中使用块,则这只是一个解决方案

因为C++对象在堆栈上,所以它会消失,所以如果你用这个块复制它并稍后调用它,指针将无效。在最好的情况下,你会崩溃。在最坏的情况下,用于该对象的RAM芯片上的点已再次用于其他对象,您将覆盖其他一些内存位,并导致看似无关的崩溃


因此,如果您想保留块,您必须执行“objP=new MyCppClass”来创建对象,然后执行“delete objP”(可能在最后一次调用块时执行,如果您可以检测到这一点,并且之后不需要对象)来摆脱它。

“取消引用指针比使用引用要花费更多的时间”我无法想象这怎么可能。对于关键性能代码,您可能会发现使用C++11 lambda会使它更快,因为它可以由编译器内联。为什么您认为取消引用指针会花费更多时间?你有没有分析过这是否会产生重大影响?复制整个对象可能比传递指针要昂贵得多,而使用引用基本上是一样的。我担心当使用指针时,编译器优化代码的能力会降低,因为它不知道实际对象相对于块有固定的内存偏移量。因为我不知道如何在这种情况下使用引用,所以我无法测试和比较性能。但是使用c++11 lambdas实际上似乎是一个非常好的主意。谢谢布莱恩!:)“取消指针比函数调用或C++方法调用快”这是不正确的。这取决于编译时对函数调用的了解。如果只使用静态类型并在堆栈上本地创建对象,编译器可以任意展开和内联扩展函数调用,直到在运行时不会发生任何指针解引用(除了将计算结果存储在内存中的某个动态数组中)。但是如果显式使用指针,编译器可能根本无法进行任何优化,指针取消引用将不可避免。此外,避免使用指针通常会导致代码可读性更高、出错率更低。@DominikSeibold:如果该方法不是虚拟的,编译器也会在编译时准确地知道要进行的函数调用,并且可以类似地将其内联。@newacct是的,您是对的。我的观点应该是,如果编译器已经知道我在调用哪个类型的函数,因为它是静态的,并且对象就在堆栈的附近,一方面,不会有任何指向远端系统内存中未知对象的指针,另一方面,编译器可以对对象的值进行更高级的推断,并进行更多的优化。