Предположим, someClass
- это класс, определенный в C # с некоторым методом int doSomething(void)
, и для простоты он предоставляет конструктор без аргументов. Затем в C # необходимо создать экземпляры в куче gc:
someClass c; // legit, but only a null pointer in C#
// c->doSomething() // would not even compile.
c = new someClass(); // now it points to an instance of someclass.
int i = c->doSomething();
Теперь, если someClass
скомпилирован в некоторую библиотеку .Net, вы также можете использовать ее в C ++ / CLI:
someClass^ cpp_gcpointer = gcnew someClass();
int i = cpp_gcpointer->doSomething();
Это просто! Острота! Это, конечно, при условии, что в проект была добавлена ссылка на библиотеку .Net, и было сделано соответствующее объявление об использовании.
Насколько я понимаю, это точный C ++ / CLI-эквивалент предыдущего примера C # (сжатый в одну строку, меня это не интересует). Правильный? (Извините, я новичок в теме)
В C ++, однако, также
someClass cpp_cauto; // in C++ declaration implies instantiation
int i = cpp_cauto.doSomething();
- допустимый синтаксис. Из любопытства я попробовал это сегодня. Коллега, оглядываясь через плечо, был готов поспорить, что он даже не скомпилируется. Он бы проиграл пари. (Это все еще класс из сборки C #). На самом деле он выдает также тот же результат i
, что и код из предыдущих примеров.
Изящный тоже, но ... хм ... что именно, что здесь создано? Мое первое странное предположение заключалось в том, что за моей спиной .Net динамически создает экземпляр в куче gc, а cpp_auto
является своего рода оберткой для этого объекта, которая ведет себя синхронно, как экземпляр класса someClass
. Но потом я нашел эту страницу
http://msdn.microsoft.com/en-us/library/ms379617%28v=vs.80%29.aspx#vs05cplus_topic2
Эта страница, кажется, говорит мне, что (по крайней мере, если someClass был бы классом C ++) cpp_auto
фактически создается в стеке, что, насколько я знаю, будет таким же поведением, как и в классическом C ++. И то, что вы не можете сделать в C # (вы не можете, не так ли?). Что я хотел бы знать: экземпляр из сборки C # также создается в стеке? Можете ли вы создавать .Net двоичные файлы в C ++ с экземплярами классов в стеке, которые вы не можете создать в C #? И может ли это даже дать вам прирост производительности :-)?
С уважением,
Thomas