【咨询疑问】关于通过new创建对象的问题
--------------------编程问答--------------------
不可能同一地址
一般你会这么写:
this.abc = new object();
....
this.abc = new object();
只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次相同的地址
--------------------编程问答--------------------
那么在第二次new的时候,如果GC还没执行 垃圾回收,会不会就会造成额外的内存开销呢??
--------------------编程问答--------------------
会,如果你担心这个,可以 this.abc=null; this.abc=new object(); 但除非你的abc是个大东西比如int[1000000]不然没什么意思,正常赋值就好
--------------------编程问答--------------------
现在 在做一个绘图工具,绘张图。可能里面会有几十上百个图形对象,而每个图形的绘制过程中有可能会用到十好几个 画笔 画刷,什么GDI+ 的 对象类型,我想优化下代码,能 只new一次,通过改变属性重复调用的的尽量只new一次,要不然绘制过程 太慢,画板onpaint方法可能耗时太长.
--------------------编程问答--------------------
不懂= =
--------------------编程问答--------------------
刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这个 类对象的整个生存周期中,字段对象就会一直占用那块内存,这样会不会 造成 比 需要的时候 随时 new 一个新的对象 更耗资源呢...
--------------------编程问答--------------------
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不会再被分配给别的对象用来存储数据?
--------------------编程问答--------------------
那这样呢,1.只在构造是初始化一次,和2.在每次需要的地方都重新初始化一次,这两者相比,哪个更优呢?在接下来的运行中那种速度更快?
--------------------编程问答--------------------
LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。
--------------------编程问答--------------------
不是 千分之一秒,绘制的对象多的时候,会造成延迟达到两秒
--------------------编程问答--------------------
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。
--------------------编程问答--------------------
还真不好查的......我刚刚 看的时候 发现程序运行时占用内存很多,不知道以前的代码 是怎么优化的......
--------------------编程问答--------------------
现在绘图程序 动动鼠标 就会重绘,拖动图形元素的一个短暂的过程 就可能会重绘 十几次,几十个图形元素,每个图形元素里面 反复的 不断new 局部变量,也会耗费很多时间.......
补充:.NET技术 , C#