Запутано: создание экземпляра класса C # в C ++

Предположим, 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 и сделано соответствующее объявление using.

Насколько я понимаю, это точный эквивалент 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 #? И может ли это даже дать вам прирост производительности :-)?

С уважением,

Томас

16
задан Thomas 23 November 2011 в 19:18
поделиться