Предположим, 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 #? И может ли это даже дать вам прирост производительности :-)?
С уважением,
Томас