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

猴头 2013-03-14 06:32:53
我有一个类,类中有一个字段是名为 abc 的引用类型(假设是NET内置的引用类型),

如果我在构造函数中通过new给它创建一个实例,

那么就会给该字段在内存中“随机”分配一段空间用来存储数据(假设这段空间是A),

接下来,如果我在一个成员函数的调用过程中,又通过new重新给abc这个字段实例化了,假设这次分配给他的空间是B,

那么A和B这两个内存空间有可能会是内存中的同一个位置吗??
还是随机分配,位置是不同于A的在内存中其他位置的另一段存储空间??
又或者可能碰巧和A是同一段内存空间??(在分配B空间之前没有释放A空间)

我很菜,勿喷......

...全文
180 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2013-03-15
  • 打赏
  • 举报
回复
LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。
绿色夹克衫 2013-03-15
  • 打赏
  • 举报
回复
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。
引用 12 楼 yan_hyz 的回复:
引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。 不是 千分之一秒,绘制的对象多的时候,会造成延迟达到两秒
猴头 2013-03-15
  • 打赏
  • 举报
回复
引用 11 楼 litaoye 的回复:
LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间。
不是 千分之一秒,绘制的对象多的时候,会造成延迟达到两秒
猴头 2013-03-15
  • 打赏
  • 举报
回复
引用 13 楼 litaoye 的回复:
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。 引用 12 楼 yan_hyz 的回复:引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间……
现在绘图程序 动动鼠标 就会重绘,拖动图形元素的一个短暂的过程 就可能会重绘 十几次,几十个图形元素,每个图形元素里面 反复的 不断new 局部变量,也会耗费很多时间.......
猴头 2013-03-15
  • 打赏
  • 举报
回复
引用 13 楼 litaoye 的回复:
那你查查看,慢的原因肯定不是因为对象占了内存,而是这些对象都在做计算或其他处理。看一下内存占了多少,CPU占用多少。否则哪怕手动释放资源,也是不行的。 引用 12 楼 yan_hyz 的回复:引用 11 楼 litaoye 的回复:LZ操心的太多了,几千个对象不算啥,要相信现代计算机的处理能力。另外不是还有编译器帮你做优化么?只要不是瓶颈,一般不查那千分之一秒的时间……
还真不好查的......我刚刚 看的时候 发现程序运行时占用内存很多,不知道以前的代码 是怎么优化的......
猴头 2013-03-14
  • 打赏
  • 举报
回复
引用 8 楼 shn11160 的回复:
引用 6 楼 yan_hyz 的回复:引用 5 楼 phommy 的回复:引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址 刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这……
那这样呢,1.只在构造是初始化一次,和2.在每次需要的地方都重新初始化一次,这两者相比,哪个更优呢?在接下来的运行中那种速度更快?
猴头 2013-03-14
  • 打赏
  • 举报
回复
引用 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不会再被分配给别的对象用来存储数据?
云水千寻 2013-03-14
  • 打赏
  • 举报
回复
引用 6 楼 yan_hyz 的回复:
引用 5 楼 phommy 的回复:引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址 刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这个 类对象的整个生存周期中,字段对象就会一直占用那块内存,这样会不会 造成 比 需要的时候 随时 new 一个新的对象 更耗资源呢...
这肯定是的啦,至少不会比需要时初始化占的内存少。 先在构造函数中初始化所有字段,占内存多,但随后执行的速度快。 后初始化占内存相对较少,但之后的执行速度就会慢些。
wonkju 2013-03-14
  • 打赏
  • 举报
回复
LZ的疑问是不是说, abc = new A(); //Space "A". abc = new A(); //Space "B". 怕他们在内存冲突,是吧。 其实是不可能的,在A没有释放之前。 因为没 new 一次,都会在 堆中分配空间。 而对象在同一时刻只能指向一片内存空间,所以在第二次分配时,abc就只能取消指向"A",而指向"B".
猴头 2013-03-14
  • 打赏
  • 举报
回复
引用 5 楼 phommy 的回复:
引用 4 楼 yan_hyz 的回复:引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址 一般你会这么写: this.abc = new object(); .... this.abc = new object(); 只看第二句,是先把object给new出来,成功的话才会走赋值。……
刚刚 我又想到一个问题 ,就是 在构造函数初始化的时候 就初始化类字段,而不是 每次需要用到这个 字段的时候 再new ,那么在这个 类对象的整个生存周期中,字段对象就会一直占用那块内存,这样会不会 造成 比 需要的时候 随时 new 一个新的对象 更耗资源呢...
phommy 2013-03-14
  • 打赏
  • 举报
回复
引用 4 楼 yan_hyz 的回复:
引用 3 楼 phommy 的回复:引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址 一般你会这么写: this.abc = new object(); .... this.abc = new object(); 只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才……
不懂= =
猴头 2013-03-14
  • 打赏
  • 举报
回复
引用 3 楼 phommy 的回复:
引用 2 楼 yan_hyz 的回复:引用 1 楼 phommy 的回复:不可能同一地址 一般你会这么写: this.abc = new object(); .... this.abc = new object(); 只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址……
现在 在做一个绘图工具,绘张图。可能里面会有几十上百个图形对象,而每个图形的绘制过程中有可能会用到十好几个 画笔 画刷,什么GDI+ 的 对象类型,我想优化下代码,能 只new一次,通过改变属性重复调用的的尽量只new一次,要不然绘制过程 太慢,画板onpaint方法可能耗时太长.
phommy 2013-03-14
  • 打赏
  • 举报
回复
引用 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]不然没什么意思,正常赋值就好
猴头 2013-03-14
  • 打赏
  • 举报
回复
引用 1 楼 phommy 的回复:
不可能同一地址 一般你会这么写: this.abc = new object(); .... this.abc = new object(); 只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次相同的地址
那么在第二次new的时候,如果GC还没执行 垃圾回收,会不会就会造成额外的内存开销呢??
phommy 2013-03-14
  • 打赏
  • 举报
回复
不可能同一地址 一般你会这么写: this.abc = new object(); .... this.abc = new object(); 只看第二句,是先把object给new出来,成功的话才会走赋值。new的时候已经分配了内存,赋值完后才会垃圾回收,所以两次不可能是同一地址。不过如果你做第三次,可能得到和第一次相同的地址

110,553

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧