循环里定义变量的内存分配问题

maconelxp 2005-03-07 08:40:13
对于在循环里定义变量是不是不科学,请大家看下边的代码

foreach(XmlNode newsItemNode in newsItemNodes)
{
//变量的定义放在循环外和循环里,对内存的分配是不是也有很大影响?
//比如下行代码:我定义一个字符串变量
string str = newsLinkNode.InnerText;//对此变量的定义放在循环外和循环里,有什么不同?
request = (HttpWebRequest)HttpWebRequest.Create(newsLinkNode.InnerText);
request.Timeout = 10000;
response = (HttpWebResponse)request.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream,Encoding.GetEncoding("GB2312"),false,bufferSize);
//注意上行代码:在这个循环里每进行一次,都需要在堆栈上创建一个实例reader,这样做是不是不科学?
readPosition = reader.Read(buffer,0,buffer.Length);
newsContentBuilder.Remove(0,newsContentBuilder.Length);

while(readPosition > 0)
{
//...对流的处理
}
}

...全文
433 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
maconelxp 2005-03-14
  • 打赏
  • 举报
回复
楼上的,我的问题没有看全吧??
brightheroes 2005-03-14
  • 打赏
  • 举报
回复
string 比较特殊的说,有兴趣的,可以看看下面的链接
http://blog.csdn.net/brightheroes/archive/2004/12/20/222856.aspx
比较浮浅,-_-#
maconelxp 2005-03-14
  • 打赏
  • 举报
回复
up
maconelxp 2005-03-10
  • 打赏
  • 举报
回复
up
lonelydreamsym 2005-03-10
  • 打赏
  • 举报
回复
up
maconelxp 2005-03-10
  • 打赏
  • 举报
回复
up
qiuzhongyu 2005-03-10
  • 打赏
  • 举报
回复
现在的编译起智能化已经很高了
优化阶段,能自动解决这些问题的

一般是不用去考虑了,但是做为优秀的程序员
我觉得就应该时时有效率的观念
maconelxp 2005-03-09
  • 打赏
  • 举报
回复
up
maconelxp 2005-03-09
  • 打赏
  • 举报
回复
up
maconelxp 2005-03-08
  • 打赏
  • 举报
回复
up
maconelxp 2005-03-08
  • 打赏
  • 举报
回复
不是吧,效率怎么能不考虑呢,这样做事是不是太不负责了?
tiaoci 2005-03-08
  • 打赏
  • 举报
回复
不会有太多的问题的,

而且C#编译器会自动做优化的
(如果添加临时变量会更快的话)

没必要考虑太多的效率问题
maconelxp 2005-03-08
  • 打赏
  • 举报
回复
up
Maconel 2005-03-08
  • 打赏
  • 举报
回复
up
速马 2005-03-08
  • 打赏
  • 举报
回复
string是CLR直接管理的,是个完全特殊的类型
表想这个问题了

不妨写个程序循环一亿次看看有多少效率差别
Ivony 2005-03-08
  • 打赏
  • 举报
回复
cdo(原来我什么都不会)
我的问题你没有明白实质:
1.变量的定义我当然知道可以放在循环体外边,但是我想知道的是:放在里边,外边在内存分配的时候有什么不同?
书上说:string str;str是一个引用型的变量,会在堆栈上开辟一块儿内存,该内存存放的内容是该引用型变量实际存储的值的地址,那么现在的问题就是:放在循环里边会不会,每循环一次都需要给这个str开辟一块儿新的内存?


如果我们是C#的编译器,我们会怎么处理?

一、循环体内定义变量,只不过是将变量重置为初值而已,C#的编译器可能会这样优化代码,将int i改为i = 0;

二、值类型的是在栈上分配的,每次循环结束,原有栈上所有的值类型的变量就会被销毁。


引用类型的变量仅在new的时候才会在堆上分配内存,有多少个new,就会在堆上分配多少个实例,与赋值运算符=无关。



2.是不是对一个引用型的变量用new赋值的时候,因为new会在堆上开辟一块儿内存,保存一个对象的实例,所以,如果在循环里new的话,会不会每次都开辟一块儿内存?如果是的话,就用StreamReader reader来说吧,为什么StreamReader类的定义者不给该类的对象提供一个可供修改的Stream属性,这样,在循环里,我只需要每次指派reader对象的Stream属性即可,就不会每次都在内存里开辟新的内存区域,这样岂不是很节省内存?不过我不知道我说的是不是对的,高手予以指教

与Stream相比,StreamReader所占的资源可以忽略。。。。
DimNET 2005-03-08
  • 打赏
  • 举报
回复
放外面好吧? 个人感觉放里面没循环一次。那个str 就会从新被new一次。
maconelxp 2005-03-08
  • 打赏
  • 举报
回复
cdo(原来我什么都不会)
我的问题你没有明白实质:
1.变量的定义我当然知道可以放在循环体外边,但是我想知道的是:放在里边,外边在内存分配的时候有什么不同?
书上说:string str;str是一个引用型的变量,会在堆栈上开辟一块儿内存,该内存存放的内容是该引用型变量实际存储的值的地址,那么现在的问题就是:放在循环里边会不会,每循环一次都需要给这个str开辟一块儿新的内存?

2.是不是对一个引用型的变量用new赋值的时候,因为new会在堆上开辟一块儿内存,保存一个对象的实例,所以,如果在循环里new的话,会不会每次都开辟一块儿内存?如果是的话,就用StreamReader reader来说吧,为什么StreamReader类的定义者不给该类的对象提供一个可供修改的Stream属性,这样,在循环里,我只需要每次指派reader对象的Stream属性即可,就不会每次都在内存里开辟新的内存区域,这样岂不是很节省内存?不过我不知道我说的是不是对的,高手予以指教
sun926 2005-03-08
  • 打赏
  • 举报
回复
1、string str = newsLinkNode.InnerText;//对此变量的定义放在循环外和循环里,有什么不同?

变量定义放在循环外当然是最好的方法了,但是你写的代码并不是执行代码,还需要编译器编译之后才能是执行的代码,而编译器会进行优化,将变量的定义移到循环外,所以这两种代码最终执行的实际上是一样的代码。

reader也是一样。
maconelxp 2005-03-08
  • 打赏
  • 举报
回复
up
加载更多回复(9)

110,538

社区成员

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

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

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