【发布时间】:2012-01-05 01:55:04
【问题描述】:
假设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# 示例完全相同的 C++/CLI 示例(浓缩为一行,这不是我感兴趣的重点)。正确的? (对不起,我是这个话题的新手)
然而,在 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# 程序集的实例是否也在堆栈上创建?您可以在 C++ 中使用无法在 C# 中创建的堆栈上的类实例生成 .Net 二进制文件吗?这甚至可能会给您带来性能提升:-) 吗?
亲切的问候,
托马斯
【问题讨论】:
标签: c# .net c++ stack instantiation