C#类在什么时候分配内存

转自:http://www.cnblogs.com/hlxs/archive/2011/08/04/2127127.html

一直以为内存分配是在调用构造函数的时候。现在发现我错了。

 

  昨天在看C++的赋值运算时,想做一下笔记。一个类赋值给另一个类时,先调用构造函数,在给成员变量一个个赋值,静态成员变量不用赋值,因为静态成员变量属于类,被类的所有实例共享,所以不用被赋值,方法属于类,不用被赋值,也赋不了值。

 

突然想到调用静态的属性或方法时不需要调用构造函数,因为调用构造函数只是产生一个新的实例,静态的属性或方法属于类吗,调用它们根本不用产生实例,我突然想尖叫,不调用构造函数,怎么分配内存,不分配内存类的属性存哪里,连内存都没有怎么访问它。

 

所以我猜测内存在调用构造函数之前就分配好了,构造函数只是做一些初始化工作。

 

下面是我的测试:

 

 

      

        

 

从图中我们可以看出,在调用构造函数之前,成员变量已经初始化了,a=1,说明他们已经有属于他们的内存了,不然a=1,s=1中的1往哪存,你不要告诉我说不需要内存。调用构造函数再对非静态成员变量进行初始化。在调用静态方法PrintStatic的过程中的确没有调用构造函数,大家都知道不需要调用构造函数。静态方法中只能调用静态的方法和属性,而属性的定义,以及在定义的时候给一个初值,都是在调用构造函数之前,一切都说明属性在调用构造函数之前已经分配内存了,所以请不要说:内存在调用构造函数的时候分配。

 

一个类占用的内存是多少?我是这样认为的:

 

一个类所占的内存等于=属性总内存+方法总内存+应用该类的指针所占的内存+同步索引块的大小。

 

属性肯定是占内存的,至于方法,应该也占吧,不知道方法的内存首地址,怎么访问它。除了方法所在的内存,其他三个都是必须占内存的,类中可以没有方法吗,所以将基本类型赋给object类型(装箱),会多分配很多内存。

 

而这些所需的内存编译器是非常清楚的,所以在调用构造函数之前调用完全可以分配内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值