Objective-C++

150 views
Skip to first unread message

Dmitry Chestnykh

unread,
Jul 30, 2008, 5:26:11 PM7/30/08
to sellm...@googlegroups.com
Монстроидальная штука -- Objective-C++. Это не один, и не два, а сразу
три языка в одном!

(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++ классы не знают друг о друге.

- Дмитрий Честных.

ov

unread,
Jul 31, 2008, 1:15:10 AM7/31/08
to sellme-dev
> PS ObjC и C++ классы не знают друг о друге.

ну зачем же так сразу... наследоваться они не могут друг от друга. а
вызывать - запросто. меня это постоянно спасает.

вчера вот встала задача вычислять ширину закладок в собственном таб-
контроле. там небанальный алгоритм, поэтому запихнув несколько
NSNumber'ов в NSArray, я вспомнил про милый сердцу STL и реализовал
всю извратную математику на С++. вектор с результатами ушел в
Objective-C++ и там был заюзан.

Dmitry Chestnykh

unread,
Jul 31, 2008, 6:42:24 AM7/31/08
to sellme-dev
> > PS ObjC и C++ классы не знают друг о друге.
>
> ну зачем же так сразу... наследоваться они не могут друг от друга. а
> вызывать - запросто. меня это постоянно спасает.

Вызывать-то да. Вот список того, что нельзя:

* A C++ class cannot derive from an Objective-C class and vice versa.
* C++ namespaces cannot be declared inside an Objective-C declaration.
* Objective-C classes cannot have instance variables of C++ classes
which do not have a default constructor or which have one or more
virtual methods, but pointers to C++ objects can be used as instance
variables without restriction (allocate them with new in the -init
method).
* C++ "by value" semantics cannot be applied to Objective-C objects,
which are only accessible through pointers.
* An Objective-C declaration cannot be within a C++ template
declaration and vice versa. Objective-C types, (e.g., Classname *) can
be used as C++ template parameters, however.
* Objective-C and C++ exception handling is distinct; the handlers of
each cannot handle exceptions of the other type.
* Care must be taken since the destructor calling conventions of
Objective-C and C++'s exception run-time models do not match (i.e., a C
++ destructor will not be called when an Objective-C exception exits
the C++ object's scope).

(Википедия - http://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B)

> вчера вот встала задача вычислять ширину закладок в собственном таб-
> контроле. там небанальный алгоритм, поэтому запихнув несколько
> NSNumber'ов в NSArray, я вспомнил про милый сердцу STL и реализовал
> всю извратную математику на С++. вектор с результатами ушел в
> Objective-C++ и там был заюзан.

OMG! Хорошо, что у тебя проект _до этого_ использовал C++ :)

- Дмитрий Честных.

Vitaly Ovchinnikov

unread,
Jul 31, 2008, 7:09:02 AM7/31/08
to sellm...@googlegroups.com
это уже новый проект. думал обойтись objective'ом - не вышло.
в предыдущем чего только стоили прокси-классы С++, которые реализовали
callback-интерфейсы и кидали нотификации в Objective-C :)

Dmitry Chestnykh

unread,
Jul 31, 2008, 7:23:17 AM7/31/08
to sellm...@googlegroups.com
> это уже новый проект. думал обойтись
> objective'ом - не вышло.
> в предыдущем чего только стоили
> прокси-классы С++, которые реализовали
> callback-интерфейсы и кидали нотификации
> в Objective-C :)

А, вижу. Поздравляю с релизом! :)

А чего не хватило кроме арифметики для
табов?

- Дмитрий Честных.

Vitaly Ovchinnikov

unread,
Jul 31, 2008, 7:30:59 AM7/31/08
to sellm...@googlegroups.com
спасибо.
арифметики и не хватило. надо было умно ресайзить самый большой таб,
если места не хватало.
а самых больших могло быть несколько. ну и там сразу сортировки
потребовались, поиск итд итп

2008/7/31 Dmitry Chestnykh <dmi...@codingrobots.com>:

Reply all
Reply to author
Forward
0 new messages