Предположим, что someClass
- это класс, определенный в С# с некоторым методом int doSomething(void)
, и для простоты, предоставляющий конструктору без аргументов. Затем в С# экземпляры должны быть созданы в куче 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, вы также можете использовать его в С++/CLI:
someClass^ cpp_gcpointer = gcnew someClass();
int i = cpp_gcpointer->doSomething();
Это просто! Острота! Это, конечно, предполагает, что в проект добавлена ссылка на библиотеку .Net, и была сделана соответствующая декларация использования.
Я понимаю, что это точный эквивалент С++/CLI предыдущего примера С# (сжатый до одной строки, это меня не интересует). Верный? (Извините, я новичок в этой теме)
В С++, однако, также
someClass cpp_cauto; // in C++ declaration implies instantiation
int i = cpp_cauto.doSomething();
- действительный синтаксис. Из любопытства я пробовал это сегодня. Коллега, глядя через мое плечо, готов был поспорить, что он даже не скомпилировался. Он проиграл бы ставку. (Это все еще класс из сборки С#). Фактически он также дает тот же результат i
как код из предыдущих примеров.
Ничего, но... ммм - что это такое, что здесь создано? Мое первое дикое предположение заключалось в том, что за моей спиной .Net динамически создает экземпляр в куче gc, а cpp_auto
является своего рода оболочкой для этого объекта, который синтаксически ведет себя как экземпляр класса someClass
. Но затем я нашел эту страницу
http://msdn.microsoft.com/en-us/library/ms379617%28v=vs.80%29.aspx#vs05cplus_topic2
Эта страница, кажется, говорит мне, что (по крайней мере, если someClass был классом С++) cpp_auto
фактически создан в стеке, что, насколько мне известно, будет тем же самым поведением, которое вы получите в классическом С++. И что-то, что вы не можете сделать на С# (вы не можете, не так ли?). То, что я хотел бы знать: является ли экземпляр сборки С#, созданной в стеке? Можете ли вы создавать .Net файлы в С++ с экземплярами классов в стеке, которые невозможно создать на С#? И возможно ли это даже дать вам прирост производительности:-)?
С уважением,
Томас