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

简介:

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

 

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

 

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

 

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

 

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

 

下面是我的测试:

 

 

      

        

 

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

 

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

 

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

 

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

 

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

 

 作者:陈太汉

 

本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2011/08/04/2127127.html

目录
相关文章
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
1078 55
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
584 8
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
376 6
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
268 6
非静态内部类持有外部类引用导致内存溢出
非静态内部类持有外部类引用导致内存溢出
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
1360 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
2096 13
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
868 4
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
381 3
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。