回答
严格地说,它取决于代码的位置。
如果代码是常规函数/方法,它将只影响堆栈。对堆没有任何影响,因为尚未构建MyClass对象。
假设MyClass是一个类(即引用类型),声明将在栈上保留足够的空间来容纳对MyClass对象的引用。
这两个声明略有不同 - 第一个声明没有被初始化,所以任何尝试访问oMyClass1之前它被设置为某些东西会给编译器错误。第二个是初始化的,所以你不会遇到编译器错误[虽然如果你在设置它引用一个实际的对象之前访问了oMyClass2的方法或属性,你会得到一个运行时错误,与oMyClass2 = new MyClass();]。
如果代码是一个类声明中:
class Fred {
MyClass oMyClass1;
MyClass oMyClass2 = null;
}
那么它只会在Fred构造函数中执行。在构造函数被调用之前,空间(对于Fred对象,包括两个MyClass引用的空间)已经在堆上分配了。这两行代码实际上不起作用,因为空格已经被初始化为空。
如果它在一个结构声明内,只会在堆栈上(如果结构是本地的)或全局变量内存(如果结构是静态的)产生相似效果。 [虽然,公平地说,我有点不确定在C#中静态分配的位置 - 我只是假设它以类似于C++的方式完成]
我的疑问是如何将上述两行影响内存(堆栈&堆)。
信息不足,两种可能性:
他们是局部变量。在这种情况下,这两行在堆栈上(无论何时执行该方法多长时间)进行2次相同的分配(参考,总是32/64位)。在堆上没有分配。
它们是类或结构中的字段。在这种情况下,这两行分配创建时实例中引用的大小。该实例可以在堆栈上(当它们是struct成员时)或堆(类成员)上分配。
+1编辑之后,在点2中区分结构和类。 –
- 1. 内存分配,堆栈和堆栈
- 2. 栈和堆内存
- 3. C程序的堆栈和堆内存
- 4. Java堆和堆栈内存分配
- 5. 堆栈和堆栈内存存储在C++
- 6. 如何影响堆内存的大小?
- 7. 关于堆栈和堆栈内存使用的问题
- 8. WebAssembly堆栈/堆栈指针初始化和内存布局
- 9. 其他内存区域(堆栈和堆栈除外)?
- 10. Console.WriteLine如何影响异常堆栈
- 11. 垃圾收集是否影响堆栈?
- 12. 堆栈内存的iostream
- 13. Android中的堆栈内存
- 14. 的memcpy堆栈内存
- 15. JVM - 堆栈和堆栈
- 16. C++堆栈内存和CPU缓存
- 17. OOP和堆/堆栈
- 18. 块,堆栈和堆
- 19. .NET堆栈内存限制
- 20. 堆栈内存位置
- 21. 堆栈帧内存分配
- 22. C堆栈内存布局
- 23. 堆vs堆栈存储
- 24. 存储在堆栈或堆
- 25. 内存中的堆栈实际上是一个堆栈吗?
- 26. 多个堆栈和堆放在虚拟内存中的位置?
- 27. 进程虚拟内存 - 堆栈和堆之间的空间
- 28. 静态,堆栈和堆内存分配的地址排序?
- 29. 导出寄存器对堆栈的性能影响是什么?
- 30. 在内存中创建叉和堆栈
正如我已经在一个现在被删除的答案中所说的,不是类成员的值类型的实例*并不总是存储在堆栈中*。如果它们被lambda表达式或迭代器块捕获,它们将被存储在堆上。 –
引用只会在堆栈上分配,如果它们是本地人。如果他们是班级成员,他们将会堆积如山。 –
@Frédéric值得详细说明的是,如果他们被拉姆达捕获,他们不再是“本地人”。它们将被转换为对闭包类(即包装对象)的属性的引用。闭包坐在堆上。 –