可以说,您想编写一种处理大型数据集的高性能方法。为什么开发人员不应该能够打开手动内存管理而不是被迫移至C ++?

void Process()
{
    unmanaged
    {
        Byte[] buffer;
        while (true)
        {
            buffer = new Byte[1024000000];

            // process

            delete buffer;
        } 
    }   
}
有帮助吗?

解决方案

因为允许您手动删除内存块,而可能仍会引用它(并且运行时无法知道如果不进行GC周期)会产生悬而未决的指针,从而破裂 记忆安全. 。 GC语言通常按设计是内存安全。

也就是说,在C#中,特别是您可以做自己想做的事:

void Process()
{
    unsafe
    {
        byte* buffer;
        while (true)
        {
            buffer = Marshal.AllocHGlobal(1024000000);

            // process

            Marshal.FreeHGlobal(buffer);
        } 
    }   
}

请注意,与C/C ++一样,您对C#中的原始指针类型具有完整的指针算术 - buffer[i] 或者 buffer+i 是有效的表达。

其他提示

如果您需要高性能和详细的控制,也许您应该在C或C ++中写下您的工作。并非所有语言都对万物有好处。

编辑要添加:单语言对所有事情都不会有好处。如果您在所有优质的编程语言中添加所有有用的功能,那么即使您可以避免不一致,也将变得非常大,比C ++差得多。

功能不是免费的。如果语言具有功能,人们可能会使用它。如果不学习新的C#手动内存管理例程,您将无法足够学习C#。编译器团队将以其他有用的编译器功能为代价实施它。该语言可能很难像C或C ++这样的解析,这会导致汇编缓慢。 (作为C ++的家伙,当我编译我们的C#项目之一时,我总是感到惊讶。编译似乎几乎是瞬时的。)

特征相互冲突,有时以意想不到的方式进行冲突。 C90不能在矩阵计算上做得很好,因为c clies的可能性可防止一些优化。如果您允许使用一种语言的指针算术,则必须接受其后果。

您建议使用C#扩展程序以允许手动内存管理,并且在少数情况下会有用。这意味着必须以不同的方式分配内存,并且必须有一种方法来告诉手动管理的内存从自动管理的内存中。突然,您使内存管理复杂化,程序员有更多机会搞砸,并且内存管理器本身更加复杂。在少数情况下,您会获得一些重要的表现,以换取在所有情况下更多的并发症和较慢的内存管理。

可能在某个时候,我们将拥有一种编程语言,从脚本到数字缩写几乎所有目的都有益,但是在附近的任何地方都没有任何受欢迎的内容。同时,我们必须愿意接受仅使用一种语言的局限性,或者学习几种语言和之间的挑战。

在您发布的示例中,为什么不删除缓冲区并重复使用呢?

.NET垃圾收集器非常擅长研究哪些对象不再引用,并及时释放相关的内存。实际上,垃圾收集器有一个特殊的堆(大物体堆),其中将像这样的大物体放置在其中,可以优化来处理它们。

最重要的是,不允许明确释放参考文献,简单地消除了带有内存泄漏和悬空指示的大量错误,这会导致更安全的代码。

用具有明确内存管理的语言单独释放每个未使用的块可能比让垃圾收集器这样做更昂贵,因为GC有可能使用复制方案将时间线性花费到剩下的块数量(或最近的块数量),而不必处理每个死块。

大多数内核不会让您安排自己的线程的同样原因。因为您不需要99.99+%的时间,并且剩下的时间暴露该功能只会诱使您做一些潜在的愚蠢/危险的事情。

如果您确实需要精细的谷物内存控制,请在其他内容中写下该代码部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top