<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/</link>
<title><![CDATA[c程序中变量在循环内部还是外部声明的问题]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[c程序设计]]></category>
<pubDate>Mon, 09 Apr 2012 07:40:27 +0000</pubDate> 
<guid>http://www.snooda.com/read/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;忘记之前从哪看过的一个文章说不要在for、while等循环内声明变量，因为每次都会重复分配空间，很慢。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;今天发现一个模块把变量声明都放到while里面了，看了下代码没有发现必须声明在里面的原因，于是开始怀疑是不是声明在内外是差不多的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;于是测试了一下：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>int main() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;for(;i < 10000000; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int b;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br/>&#125;<br/></div></div><br/><br/>使用gcc 编译，把int b放在循环内外试了试，用time ./a.out查看执行时间，发现用时基本相同。<br/>添加-O2优化选项，执行时间均缩减到之前的1/3，内外两种方式时间依然相同。<br/>定义了一个struct实验了下，结果相同<br/>也就是说栈上元素的操作不必纠结于变量声明于何处。<br/><br/>尝试了下堆上元素操作，在预料之内：时间差距巨大，因为重复分配释放内存。<br/><br/>所以对于栈上元素，声明放在循环里和循环外是一样的。堆上元素不同，需注意。<br/><br/>另，仍然需要注意一些计算操作需要放在循环外，比如求大小之类的，避免循环的每个周期重复计算。<br/><br/><br/>原因猜测：1， cpu对栈操作有优化，速度非常快。<br/>2，编译器的基本优化中会优化（gcc没有使用-O参数时仍会优化）<br/>具体原因待深究
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/#blogcomment</link>
<title><![CDATA[[评论] c程序中变量在循环内部还是外部声明的问题]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>