当前位置: 首页 > 编程语言 > C#

c#结构-类栈-堆控制?分享

时间:2023-04-11 03:20:08 C#

c#structs/classes栈/堆控制?所以在C++中很容易。您要在堆上分配的任何类/结构,请使用new。如果你想要它在堆栈上,不要使用新的。在C#中,我们总是使用new关键字,并且根据它是结构还是类,将其分配在堆栈或堆上(结构到堆栈,堆到类)——在某些应用程序中,设计时可能会发生巨大的变化性能差异,只有那些对象进入它们真正所属的堆。我想知道的是-是否有一种直接的方法来控制对象的分配位置,而不管它是声明为结构还是类?我知道值类型(结构)可以装箱以进入堆(但装箱/拆箱会产生性能成本)。有没有办法在堆栈上分配类?另外,是否有任何机制来分配原始内存并使用C++中的placementnew之类的东西?我知道这打破了被管理的想法——但如果你可以使用自定义内存管理,它可以在性能上产生很大的不同。我喜欢C#是因为它的便利性,因为它的垃圾收集器和其他东西——但有时,在处理应用程序中的瓶颈时,人们可能希望对实际发生的事情有更多的控制。欢迎任何提示/提示:)编辑:性能示例:structFoo1{publicinti;公众持股量f;公共双d;}structFoo2{publicFoo1[]bar;publicvoidInit(){bar=newFoo1[100];for(inti=0;i<100;i++)bar[i]=newFoo1();}}classProgram{staticvoidMain(string[]args){DateTimetime=DateTime.Now;Foo2[]arr=newFoo2[1000000];对于(inti=0;i<1000000;i++){arr[i]=newFoo2();arr[i].Init();}Console.WriteLine((DateTime.Now-时间).TotalMilliseconds);在我的机器上执行需要1.8秒(注意实际上只有分配在进行-没有传递参数)如果Foo1从结构更改为类,执行需要8.9秒!这慢了五倍虽然在一般情况下对象总是在堆上分配,但C#确实允许您下降到指针级别以获得繁重的互操作或非常高性能的关键代码。在不安全的块中,您可以使用stackalloc在堆栈上分配对象并将它们用作指针。引用他们的例子://cs_keyword_stackalloc.cs//编译:/unsafeusingSystem;类测试{publicstaticunsafevoidMain(){int*fib=stackallocint[100];整数*p=fib;*p++=*p++=1;对于(inti=2;i<100;++i,++p)*p=p[-1]+p[-2];对于(inti=0;i<10;++i)Console.WriteLine(fib[i]);但请注意,您无需声明整个方法不安全,您可以使用不安全的{...}块。您对值类型与引用类型(堆栈与堆)的位置的解释不太正确。如果结构是引用类型的成员,则它们也可以在堆上分配。或者,如果您在通过对象引用传递它们时将它们装箱。您应该阅读http://www.yoda.arachsys.com/csharp/memory.html以更好地了解不同类型的实际分配位置。此外,在.Net中,您真的不应该关心类型的分配位置-正如EricLippert所写:堆栈是一个实现细节。您更好地理解类型传递的语义(按值、按引用等)。此外,您似乎暗示在堆上分配对象比在堆栈上分配更昂贵。事实上,我认为复制值类型的性能成本超过了在堆栈上稍快分配所带来的任何节省。堆栈和堆之间的最大区别在于,在大多数CPU架构上,堆栈更有可能保留在CPU缓存中——从而避免缓存未命中。这不是最重要的问题。您应该决定该类型是否应该具有按值传递语义。如果不是——那么也许它应该是一个引用类型。不要被new关键字所迷惑,它对于结构是可选的。在C#中,有一个托管世界,您可以在其中享受垃圾收集器和类型安全,而不必(不必)担心许多内存细节。堆栈/堆的区别无关紧要,它与复制语义有关。对于极少数需要控制的情况,C#中存在不安全(非托管)部分,其中包含真正的指针和所有内容。但是C#中的东西的成本与C++中的不一样,所以不要找鬼,非托管的临时项目非常便宜。并且编译器可能会在堆栈上分配小数组作为优化,您将无法分辨,也不应该关心。别担心——你的脑袋还在c/c++世界里,在那里事情发生很重要。CLR团队中有很多非常聪明的人整天都在为这种神奇的速度发愁。c#中存在一些问题,内存使用通常与意外创建大量小对象有关(在循环中执行string=string+otherstring是经典的)有一个memprofiler会告诉你发生了什么,如果你真的认为你有内存管理引起的性能问题我已经用C#(图形渲染客户端、Web服务器)编写了很多性能密集型代码,并且从来不必担心这些问题下面是C#中结构和类的错误方式。在C#中,struct和class的区别不在于分配的位置,而在于复制语义。结构具有值语义,而类具有引用语义。C++程序员倾向于阅读更多,因为他们习惯于堆栈上的对象具有值语义和堆上的对象具有引用语义。如何分配此内存是运行时的实现细节。运行时可以使用堆栈、堆或它喜欢的任何其他混合分配方案。虽然通常结构会分配在堆栈之类的东西上,而类会分配在某种堆上,但这不是必需的。例如,一个在函数中分配但不传递到函数范围之外的类可以很容易地在堆栈上分配。以上就是C#学习教程:c#structs/classesstack/heapcontrol?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: