我可以在 .net 和 C# 堆栈中创建我的类的对象吗? 例如:
class abc { int i=1; }
abc a1=new abc();
现在,这里的对象是在堆中创建的。那么,如果对象的大小不大,有没有办法在ram的堆栈内存中创建对象呢?
.NET 引用类型始终存在于 GC 堆上。在其他地方不可能有它们。甚至 C++/CLI 也支持类似的东西
System::Random rnd;
rnd.Next();
看起来像堆栈变量,实际上在 GC 堆上创建
Random
类(如果实现了 Dispose
,则在块末尾调用其 IDisposable
方法。)
也就是说,正如 Eric Lippert 所说,堆栈是一个实现细节,您应该主要关心您创建的类型的引用或值语义。
如果您使用
struct
而不是 class
,您将创建一个将在堆栈上创建的值类型。关于这一点,有很多事情需要考虑。 《框架设计指南》一书没有提出具体建议,但表明最好对差异进行基准测试并确定是否真的值得实现值类型。
埃里克·利珀特:
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 等: