常规类静态类静态方法、实例方法和数据成员在堆和堆栈上的内存分配
本文关键字:堆栈 分配 内存 数据成员 静态方法 静态类 实例方法 常规类 | 更新日期: 2023-09-27 18:02:12
这本书的大部分内容都没有讨论程序是如何执行的,以及如何在堆栈和堆上为它们分配内存。当数据存储在堆栈和堆中时。
假设我有一个像
这样的常规类public class MyClass
{
int Age=0;
string strName="None"
Double Salary=0;
public void Data1()
{
Age=30;
strName="Robin";
Salary=3500;
}
}
1),所以对于上面的类,内存将如何分配。当程序运行时,内存将被分配,或者当我们创建实例时,内存将被分配。当我们通过实例调用Data1()
时,会发生什么以及如何分配内存。内存将分配给函数调用或数据成员初始化?告诉我将为age
、name
和salary
分配多少内存。内存将在堆栈或堆上分配。
public class MyClass
{
static int y=0;
static string strComp="None"
int Age=0;
string strName="None"
Double Salary=0;
public void Data1()
{
Age=30;
strName="Robin";
Salary=3500;
}
public static void Data3()
{
y=50;
strComp="Hello";
}
}
2)如何以及何时为静态数据成员和函数分配内存。当我们打电话说MyClass.Data3()
则内存将被分配或当我们只是运行应用程序。内存是在堆上还是堆栈上分配的?
3)如何为静态类分配内存。存储在堆或堆栈上的静态类…如果堆栈,那么为什么?
这里我问了几个问题,请详细解释一下。谢谢。1。在创建类的实例时将分配内存。当您调用Data1()
时,不需要额外的内存,因为您只引用类实例的字段(而不是其他局部变量)。由于MyClass
是一个引用类型,内存将在托管堆上分配。
2)。静态方法不消耗任何内存。静态字段在您访问任何静态字段或创建它们所包含的类型的任何实例(在本例中为MyClass
)
3)。您不能创建静态类的实例,因此不会动态分配内存,只有在创建类型本身时才会分配内存。静态类保证在程序中第一次引用该类之前被加载并初始化其字段和调用其静态构造函数。静态类一旦创建,将一直保留在内存中,直到您的应用程序域被关闭。
首先,只有当你用new()指令实际创建一个类实例时,才会创建它。
MyClass a = new MyClass();
只有在创建新实例时才分配内存,包括对象的所有字段。
静态成员不属于类的对象实例。
您可以这样考虑:类本身有一个表示实际类类型的对象,所有静态成员和方法都属于该对象。(实际上不是这样的,但这样更容易理解静态概念)
静态类成员是在程序开始时创建的(或在第一次加载dll时)。
当你用new()创建一个新对象时,它是在堆中创建的(连同它的所有成员)。
在堆栈中创建的变量属于运行时环境中的方法,并且只有在您访问声明它们的块之后。