(Xcode думает, что файл в формате ObjC++, если у него расширение .mm).
Эта штука помогла портировать KHTML на Mac OS X и написать WebKit,
который используется в Safari.
Having fun:
#import <Foundation/Foundation.h>
/* C */
BOOL CFunction()
{
return YES;
}
/* ObjC */
@interface MyClass : NSObject
- (BOOL)objcMethod;
@end
@implementation MyClass
- (BOOL)objcMethod;
{
return YES;
}
@end
/* C++*/
class MyClassPlus
{
public:
BOOL plusPlusMethod()
{
return YES;
}
};
/* You don't have to understand this */
#define BeginLogTime() Microseconds(&startTime)
#define EndLogTime(s) do { Microseconds(&endTime); \
NSLog(@"%@ %f sec", s, ((double)(UnsignedWideToUInt64(endTime) - \
UnsignedWideToUInt64(startTime)))/1000000.0); } while(0)
#define MillionMilesAway(s, what) do { \
BeginLogTime(); \
for (int i=0; i < 1000000; i++) { what; } \
EndLogTime(s); \
} while(0);
int main (int argc, const char * argv[]) {
UnsignedWide startTime, endTime;
/* C function */
MillionMilesAway(@" C:", CFunction());
/* Objc method */
id my = [[MyClass alloc] init];
MillionMilesAway(@" ObjC:", [my objcMethod]);
[my release];
/* Objc method - direct */
my = [[MyClass alloc] init];
SEL mySel = @selector(objcMethod);
IMP myImp = [my methodForSelector:@selector(objcMethod)];
MillionMilesAway(@"ObjC 2:", (*myImp)(my, mySel));
[my release];
/* C++ */
MyClassPlus *myPlus = new MyClassPlus();
MillionMilesAway(@" C++:", myPlus->plusPlusMethod());
delete myPlus;
return 0;
}
Это для интереса, не настоящий бенчмарк и все такое (да, я проверил --
функция не инлайнится). Если интересно, у меня частый результат
примерно такой:
C: 0.003702 sec
ObjC: 0.009615 sec
ObjC 2: 0.004560 sec
C++: 0.004188 sec
(Еще раз повторю, что это не настоящий тест на скорость. А то еще
помидорами закидаете.)
PS ObjC и C++ классы не знают друг о друге.
- Дмитрий Честных.
2008/7/31 Dmitry Chestnykh <dmi...@codingrobots.com>: