当前位置:编程学习 > C#/ASP.NET >>

【咨询疑问】关于通过new创建对象的问题

--------------------编程问答-------------------- 不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次相同的地址 --------------------编程问答--------------------
引用 1 楼 phommy 的回复:
不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次相同的地址


那么在第二次new的时候,如果GC还没执行 垃圾回收,会不会就会造成额外的内存开销呢?? --------------------编程问答--------------------
引用 2 楼 yan_hyz 的回复:
引用 1 楼 phommy 的回复:不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次……


会,如果你担心这个,可以 this.abc=null; this.abc=new object(); 但除非你的abc是个大东西比如int[1000000]不然没什么意思,正常赋值就好 --------------------编程问答--------------------
引用 3 楼 phommy 的回复:
引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址……


现在 在做一个绘图工具,绘张图。可能里面会有几十上百个图形对象,而每个图形的绘制过程中有可能会用到十好几个 画笔 画刷,什么GDI+ 的 对象类型,我想优化下代码,能 只new一次,通过改变属性重复调用的的尽量只new一次,要不然绘制过程 太慢,画板onpaint方法可能耗时太长. --------------------编程问答--------------------
引用 4 楼 yan_hyz 的回复:
引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才……


不懂= =  --------------------编程问答--------------------
引用 5 楼 phommy 的回复:
引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址

一般你会这么写:
this.abc = new object();
....
this.abc = new object();

只看第二句,是先把object给new出来,成功的话才会走赋值。……


刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这个 类对象的整个生存周期中,字段对象就会一直占用那块内存,这样会不会 造成 比 需要的时候 随时 new 一个新的对象 更耗资源呢...  --------------------编程问答-------------------- LZ的疑问是不是说,
abc = new A(); //Space "A".
abc = new A(); //Space "B".
怕他们在内存冲突,是吧。
其实是不可能的,在A没有释放之前。
因为没 new 一次,都会在 堆中分配空间。
而对象在同一时刻只能指向一片内存空间,所以在第二次分配时,abc就只能取消指向"A",而指向"B".
--------------------编程问答--------------------
引用 6 楼 yan_hyz 的回复:
引用 5 楼 phommy 的回复:引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址

刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这个 类对象的整个生存周期中,字段对象就会一直占用那块内存,这样会不会 造成 比 需要的时候 随时 new 一个新的对象 更耗资源呢...

这肯定是的啦,至少不会比需要时初始化占的内存少。
先在构造函数中初始化所有字段,占内存多,但随后执行的速度快。
后初始化占内存相对较少,但之后的执行速度就会慢些。 --------------------编程问答--------------------
引用 7 楼 king769147 的回复:
LZ的疑问是不是说,
abc = new A(); //Space "A".
abc = new A(); //Space "B".
怕他们在内存冲突,是吧。
其实是不可能的,在A没有释放之前。
因为没 new 一次,都会在 堆中分配空间。
而对象在同一时刻只能指向一片内存空间,所以在第二次分配时,abc就只能取消指向"A",而指向"B".


不是,我的意思是,A B 两块内存区域,开始 对象abc占用A ,然后 对象abc改为占用B,如果在对象abc由指向A改为 指向B的过程中,GC,没来得及进行垃圾回收(还没收回A),那是不是 说在这个过程中A不会再被分配给别的对象用来存储数据?  --------------------编程问答--------------------
引用 8 楼 shn11160 的回复:
引用 6 楼 yan_hyz 的回复:引用 5 楼 phommy 的回复:引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址

刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这……


那这样呢,1.只在构造是初始化一次,和2.在每次需要的地方都重新初始化一次,这两者相比,哪个更优呢?在接下来的运行中那种速度更快? --------------------编程问答-------------------- LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。 --------------------编程问答--------------------
引用 11 楼 litaoye 的回复:
LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。


不是 千分之一秒,绘制的对象多的时候,会造成延迟达到两秒 --------------------编程问答-------------------- 那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。

引用 12 楼 yan_hyz 的回复:
引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。

不是 千分之一秒,绘制的对象多的时候,会造成延迟达到两秒
--------------------编程问答--------------------
引用 13 楼 litaoye 的回复:
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。

引用 12 楼 yan_hyz 的回复:引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间……


还真不好查的......我刚刚 看的时候 发现程序运行时占用内存很多,不知道以前的代码 是怎么优化的...... --------------------编程问答--------------------
引用 13 楼 litaoye 的回复:
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。

引用 12 楼 yan_hyz 的回复:引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间……


现在绘图程序 动动鼠标 就会重绘,拖动图形元素的一个短暂的过程 就可能会重绘 十几次,几十个图形元素,每个图形元素里面 反复的 不断new 局部变量,也会耗费很多时间.......

补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,