【问题标题】:c++ c# equivaltent object instancec++ c# 等价对象实例
【发布时间】:2017-04-20 22:19:01
【问题描述】:

C#

MyClass myClass = new MyClass(); 

C++

MyClass* myClass = new MyClass();

C# 代码在内部是否等同于 C++ 代码? C# 代码内部的 myClass 是指代对象还是指针?

【问题讨论】:

  • 我不确定你是否应该像这样比较它们。非常粗略地说,在 C++ 中你有引用、指针和值(我知道),在 C# 中你有类和结构。你应该学会相应地使用它们。它们都有不同的用法
  • @Default 在 C# 中我们通常将它们称为“引用类型”和“值类型”
  • @BradleyDotNET 这绝对是一个更好的措辞! (虽然来不及编辑)
  • 是的,它是一个普通的指针,正是 C++ 使用的风格。如果不是这种情况,C# 无法接近 C++ 性能。唯一额外的细节是垃圾收集器可以找到它。在 C++ 中,程序员必须找到它并显式调用删除运算符。或者请其他班级的帮助来完成这项工作,这就是 perf 开始受到影响的地方。

标签: c# c++ pointers reference


【解决方案1】:

表达此 C# 代码意图的更准确方式

var myClass = new MyClass(); 

在 C++ 中可能是

auto myClass = std::make_shared<MyClass>();

(或者可能是std::shared_ptr&lt;MyClass&gt; myClass(new MyClass());)。

当然,C# 使用的东西完全不同于std::shared_ptr(垃圾收集),但程序员看到的内容大体相同——至少对于这个非常简单的示例而言。

您的原始 C++ 代码会造成内存泄漏,而这在 C# 中是不容易发生的。

【讨论】:

  • 另外,最大的不同是你必须在 C++ 中删除分配的内存(手动),而 C# 是管理分配的内存(自动)。
【解决方案2】:

它们并不完全等效,因为 C# 对象由垃圾收集器 (MSDN) 跟踪。要在 C++ 中获得类似的功能,您需要使用 shared_ptr

然而,从使用它们的角度来看,同样的概念也适用。通过引用所做的更改将传播到“指向”同一对象的其他引用等。

【讨论】:

  • C# 使用垃圾回收,而不是引用计数。
  • “引用基本上只是指针”。您的意思是在内部,对,因为引用是 const 并且在语义上它也应该以不同的方式使用? “在 C++ 中,auto_ptr 基本相同”。你写的基本,这激怒了我。在 C# 中,myClass 现在是语义引用还是指针/shared_ptr?
  • @SLaks 很抱歉,显然该框架实际上使用了某种其他算法
  • @Gernot 不确定它们是否比指针更 const(特别是考虑到您可以将 ref 与它们一起使用)。我试图改写答案,如果我错过了其他内容,请随时告诉我
  • 可能不建议 auto_ptr,因为它在 C++11 中已被弃用?
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 2011-04-30
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多