没有垃圾收集的.NET的力量?

时间:2009-09-18 05:38:15

标签: c# .net c++ memory-management garbage-collection

我喜欢C#,因为.NET框架的强大功能使得它很容易为Windows开发。但是我也喜欢标准的C ++,主要是因为它让我对内存管理进行了微调。有没有办法让两全其美?是否有可以与.NET框架中丰富的库集竞争的C ++库?或者有没有办法手动释放我从未使用过的.NET语言中的内存?或者是否可以在标准C ++应用程序中使用.NET dll?我知道,我真的在这里伸展,但我相信魔法。

8 个答案:

答案 0 :(得分:6)

你看过Boost吗?

或者,你可以使用“C ++ / CLI”(a.k.a。托管C ++,a.k.a。C ++。NET);用这种语言编写的代码可以调用.NET API,也可以通过传统的Win32 API手动管理内存,如HeapAlloc / HeapFree。但根据我的经验,这种语言最常用于编写“胶水代码”,而不是用于从头开始构建应用程序。

答案 1 :(得分:3)

如果你真的想拥有明确的访问指针等(from MSDN),你也可以在C#中“固定”代码段:

unsafe static void TestMethod()
{
  // assume class Point { public int x, y; }
  // pt is a managed variable, subject to garbage collection.
  Point pt = new Point();

  // Using fixed allows the address of pt members to be
  // taken, and "pins" pt so it isn't relocated.

  fixed (int* p = &pt.x)
  {
      *p = 1;
  }        
}

但实际上,我认为你最好确定一下你为什么要自己管理内存 - 我认识的大多数开发人员宁愿专注于系统的实际设计和构建,而不是担心解除分配大块的记忆。这里还有其他很好的建议,例如Boost(虽然老实说,如果你有cajones宣布你比GC更好,你可能已经知道Boost),Qt和.NET桥接(地狱,你可以在一个非托管的进程中托管CLR,如果你愿意的话,但是我怀疑在你自己管理内存的几个地方,你最好将它们限制在一个由VC引用的VC ++项目中。其余的解决方案。

答案 2 :(得分:1)

Qt似乎是一个广泛的C ++类库。

答案 3 :(得分:1)

  

是否有C ++库可以   与丰富的图书馆竞争   在.NET框架中?

QT让人想起,但我怀疑它是否像.NET库一样丰富。

  

有没有办法手动解除分配   其中一种.NET语言的内存   我从来没用过?

答案是肯定和否。在.NET中有某些方法可以控制内存。有weak references,强引用,(sort of) Forced Garbage collection等。但这些内容已在此处详细讨论过。

以下是有关.NET中的内存管理如何工作的一些细节。

Garbage collection and generations
Best practices of Forcing GC in .NET
Better still, read the links in this search query

  

是否可以在a中使用.NET dll   标准C ++应用程序?

是的,您可以为.NET DLL生成COM包装器/非托管包装器,并可以在C ++应用程序中使用它。

答案 4 :(得分:1)

  1. 您可以通过COM在C ++项目中使用.NET dll,或者您可以托管CLR并与CLR实体进行交互,这将是非常繁琐的编码,但是可能。设置Com Visible为true可以通过VB / MFC中的COM访问.NET对象。

  2. .NET几乎没有垃圾收集器的方法,你可以明确地运行以收集garbate,它有可用于在课堂上处理你的成员的IDisposable入口,并且使用“using”关键字你可以明确地调用dispose方法在使用示例结尾处。

  3. using(FileStream fs = File.OpenRead("xyz.txt"){
       fs.Read(buff,0,100);
    }
    // here fs gets closed in dispose 
    //method automatically...
    
    1. Visual C ++ CLI项目允许您将常用的C ++和.NET集成到一个项目中。您可以在Visual Studio的各种应用程序向导中找到它。

答案 5 :(得分:1)

STL + Boost + Qt是C#和.NET的坚实竞争对手。

我最近必须使用Compact Framework应用程序,与Qt的简单布局相比,我对WinForms方式感到失望。处置模式也非常烦人,不清楚哪些资源需要处理,哪些没有,所以我最终搜索了使用()的安全应用。

在我看来,unmanaged resource handling比C ++的RAII更复杂。

答案 6 :(得分:1)

这就是为什么你需要no-GC .NET的一个原因;在wp7或即将推出的win8平板电脑上开发XNA游戏。如果你对对象分配不小心,GC确实会产生不稳定的游戏体验,因为它会定期开始。有很多方法可以通过对象池等来实现它。但是,您无法控制所有创建的对象。因此,无法保证对象将通过相同的池化机制。我可以想象一种特殊的GC模式,它暂停收集,直到你告诉它继续。在无GC模式下,它不会进行任何集合,但它会重用对象释放的内存,而不是先等待集合。非常像C ++内存管理器。它可以通过检查对象的内存区域是否应该立即可用来实现。我确信它的实现比我在这里描述的要难,但是有了这个功能是值得的,这样.NET开发人员就可以像游戏那样实时开发。

答案 7 :(得分:0)

您可以从托管代码调用非托管代码(通过PInvoke),并从非托管代码(作为一种COM对象)调用托管代码。