2014-01-24 35 views
0

我有一个C++对象 - 对象obj我想一个块中访问:使用C++ - 在Objective-C块

MyCppClass obj; 
void(^myBlock)() = ^{ 
    obj.test(); 
}; 

这里的问题是,obj被复制成块,但我想要使用对原始对象的引用。我可以用一个指针代替:

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

但我认为解引用指针比使用引用需要更多的时间。 (性能很关键,因为在我的项目中,这样一个块被称为大图像的每个像素。)

如何访问块内的对象?

+2

“取消引用指针比使用引用需要更多时间”我无法想象这怎么可能。对于关键性能代码,您可能会发现使用C++ 11 lambda可以使其更快,因为它可以被编译器内联 –

+0

为什么您认为解引用指针需要更多时间?你有没有分析,看看是否有重大的不同?复制整个对象可能比传递指针要昂贵得多,并且使用引用本质上是一样的。 –

+0

我担心,当使用指针时,编译器不能优化代码,因为它不知道实际对象相对于该块具有固定的内存偏移量。由于在这种情况下我不知道如何使用引用,所以我无法测试和比较性能。 –

回答

0

解引用指针比函数调用或C++方法调用更快,其中包含几个指针解引用来查找类中的方法,然后实际的函数调用实际上在堆栈上分配内存,一些寄存器到RAM中,然后在返回时做相反的处理。所以不要担心这里的表现。如果剖析器显示单个指针解除引用会导致性能问题,那么您会遇到更大的问题,您应该下降到手工制作的汇编程序,并忘记使用C++类或块。此外,这是一件非常罕见的事情。

使用一个指针或C++引用(后者在引擎盖下是一样的,但很难用它拍摄自己,并且代码保持更好的可读性)。请记住,如果您要在当前函数的相同函数(或函数调用的函数)中使用该块,则这只是一个解决方案。

由于C++对象位于堆栈上,它将消失,因此如果任何人将该块复制并稍后调用它,指针将无效。在最好的情况下,你会崩溃。在最糟糕的情况下,用于该对象的RAM芯片上的位置已经被用于其他事情,并且您将覆盖其他一些内存,并导致看起来不相关的崩溃。所以,如果你想保留块,你必须做'objP = new MyCppClass'来创建对象,然后'删除objP'(也许在最后一次调用块,if你可以检测到并且在那之后不需要该对象)来摆脱它。

+0

“取消引用指针比函数调用或C++方法调用更快” 这不是事实。它取决于编译时对函数调用的了解。如果您只使用静态类型并在堆栈上本地创建对象,则编译器可以任意展开并内联展开函数调用,直到在运行时不会发生任何指针解除引用(除了存储在内存中的某个动态数组中进行计算)。 –

+0

但是,如果您明确使用指针,编译器可能根本无法做任何优化,并且指针解除引用变得不可避免。另外避免使用指针通常会导致更易读和更少错误的代码。 –

+0

@DominikSeibold:如果该方法不是虚拟的,编译器在编译时也知道要调用的函数,并且可以类似地将它内联。 – newacct