Confused: создание экземпляра класса С# в С++ - программирование
Подтвердить что ты не робот

Confused: создание экземпляра класса С# в С++

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

С уважением,

Томас

4b9b3361

Ответ 1

Ссылка на которую вы ссылаетесь подробно объясняет:

С++/CLI позволяет использовать семантику стека с ссылочными типами. Это означает, что вы можете ввести ссылочный тип, используя синтаксис, зарезервированный для выделения объектов в стеке. Компилятор позаботится о том, чтобы предоставить вам семантику, которую вы ожидаете от С++, и под обложками отвечают требованиям CLR, фактически выделяя объект в управляемой куче.

В принципе, он все еще обрабатывает ссылочный тип в управляемой куче, но автоматически вызывает Dispose() on IDisposable реализации, когда он выходит за рамки для вас.

Однако экземпляр объекта по-прежнему эффективно распределяется через gcnew (помещается в управляемую кучу) и собирается сборщиком мусора. Это также объясняется подробно:

Когда d выходит за пределы области видимости, его метод Dispose вызывается, чтобы позволить его ресурсы освобождаться. Опять же, поскольку объект фактически выделен из управляемой кучи, сборщик мусора позаботится о его освобождении в свое время.

В основном, все это обрабатывается компилятором, чтобы заставить код выглядеть и работать как стандартные классы стека классов С++, но это действительно просто компилятор. Полученный код IL все еще выполняет управляемые распределения кучи.