2014-01-24 64 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