堆栈中的对象创建

问题描述 投票:0回答:6

我可以在 .net 和 C# 堆栈中创建我的类的对象吗? 例如:

class abc { int i=1; } 
abc a1=new abc(); 

现在,这里的对象是在堆中创建的。那么,如果对象的大小不大,有没有办法在ram的堆栈内存中创建对象呢?

c# .net memory-management object
6个回答
9
投票

.NET 引用类型始终存在于 GC 堆上。在其他地方不可能有它们。甚至 C++/CLI 也支持类似的东西

System::Random rnd;
rnd.Next();

看起来像堆栈变量,实际上在 GC 堆上创建

Random
类(如果实现了
Dispose
,则在块末尾调用其
IDisposable
方法。)

也就是说,正如 Eric Lippert 所说,堆栈是一个实现细节,您应该主要关心您创建的类型的引用或值语义。


3
投票

如果您使用

struct
而不是
class
,您将创建一个将在堆栈上创建的值类型。关于这一点,有很多事情需要考虑。 《框架设计指南》一书没有提出具体建议,但表明最好对差异进行基准测试并确定是否真的值得实现值类型。


0
投票


0
投票

在 C# 中,您可以使用 using 语句归档相同的内容:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx


0
投票


0
投票

埃里克·利珀特:

https://learn.microsoft.com/en-us/archive/blogs/ericlippert/the-stack-is-an-implementation-detail-part-one

事实上,可以将值类型直接写入从堆栈分配的代码中,分配和释放速度都非常快。

github上的几个相关问题之一:

https://github.com/dotnet/coreclr/pull/6653
另请参阅 stackalloc 等:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/stackalloc

https://learn.microsoft.com/en-us/dotnet/standard/memory-and-spans/

© www.soinside.com 2019 - 2024. All rights reserved.