值类型new的背后
来源:互联网 发布:淘宝管控记录宝贝上架 编辑:程序博客网 时间:2024/05/21 14:54
大家会经常用对值类型进行new操作,如
给int类型赋默认值 int i=new int();
或者建立struct对象并调用默认构造函数 mystruct ms=new mystruct();
那问题来了,值类型的new 与 引用类型的new背后有什么区别呢?
引用类型:myClass mc=new myClass(); //引用类型new的指令实际是newobj instance。功能是分配内存空间,将新实例中的所有字段初始化为0或空引用,再调用构造函数,最后返回空间地址 (newobj用于分配和初始化对象)
值类型: int i=new int(); //值类型是执行initobj指令。功能是将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的0 。与Newobj不同,构造函数不是由initobj调用,而是系统自动调用 (Initobj用于初始化值类型)
所以引用类型的new操作和值类型的new操作是不一样的。
例:
public struct TestStruct
{
public int n;
public string s;
public StringBuilder sb;
}
当他
TestStruct t = new TestStruct();
new时的结果是什么?其结果就是调用系统默认构造函数把int类型被初始化为0,对象全部被置为null。
结论
值类型的new操作是不执行分配内存操作的,其new操作只执行初始化数据操作,调用构造函数(非initobj调用,是系统自动调用)。所以微软关于new关键字的用途的说法是不全面的。因为new还有一种只初始化数据,调用构造函数而不在托管堆分配内存的功能。
- 值类型new的背后
- C++ new函数的背后
- Java 内存(new 背后的动作)
- Java枚举类型的背后
- Java中new DerivedClass()时背后发生的事情
- new 和 delete 背后机制
- SpringMVC源码总结(八)类型转换PropertyEditor的背后
- SpringMVC源码总结(八)类型转换PropertyEditor的背后
- SpringMVC源码总结(八)类型转换PropertyEditor的背后
- 值栈背后的故事
- Windows内存管理 - 隐藏在new和malloc背后的heap
- Windows内存管理 - 隐藏在new和malloc背后的heap
- Windows内存管理 - 隐藏在new和malloc背后的heap
- Windows内存管理 - 隐藏在new和malloc背后的heap
- Libgdx New 3D API 教程之 -- 加载3D场景的背后-第一部分
- Libgdx New 3D API 教程之 -- 加载3D场景的背后-第二部分
- android studio中New Module的几个类型的区别
- java string类型 直接定义跟new的区别
- Tapestry 最新版5.1.0.5教程(十二):自定义前缀prefix
- 关于union和struct的内存分配
- 在eclipse中建立添加用户库
- 类广义表到树
- 在Eclipse中添加数据库支持
- 值类型new的背后
- 无语
- 1582年10月5日是个很奇怪的日子
- QT事件
- 深入理解Flash Player重绘
- 究竟什么是POJO
- 《Visual C++入门经典》学习笔记一(Windows编程的概念) (转)
- USACO 1.2-Milking Cows
- Oracle数据库10g中释放flash_recovery_area