- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
假设 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 二进制文件吗?这甚至可能会给您带来性能提升:-) 吗?
亲切的问候,
托马斯
最佳答案
link you referenced详细解释:
C++/CLI allows you to employ stack semantics with reference types. What this means is that you can introduce a reference type using the syntax reserved for allocating objects on the stack. The compiler will take care of providing you the semantics that you would expect from C++, and under the covers meet the requirements of the CLR by actually allocating the object on the managed heap.
基本上,它仍在对托管堆上的引用类型进行处理,但是当它超出您的范围时,会自动在 IDisposable
实现上调用 Dispose()
.
然而,对象实例仍然通过 gcnew
有效分配(放置在托管堆上)并由垃圾收集器收集。这也有详细解释:
When d goes out of scope, its Dispose method will be called to allow its resources to be released. Again, since the object is actually allocated from the managed heap, the garbage collector will take care of freeing it in its own time.
基本上,这一切都由编译器处理,以使代码看起来和工作起来像标准 C++ 堆栈分配的类,但它实际上只是一个编译器技巧。生成的 IL 代码仍在进行托管堆分配。
关于c# - 困惑: instance creation of c# class in c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247862/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!