<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>佳音的博客 &#187; c语言学习</title>
	<atom:link href="http://blog.00rz.com/category/c%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.00rz.com</link>
	<description>方乃做人之本，圆乃处世之道</description>
	<lastBuildDate>Wed, 07 Dec 2011 11:31:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>自增运算php &amp; c</title>
		<link>http://blog.00rz.com/2010/10/%e8%87%aa%e5%a2%9e%e8%bf%90%e7%ae%97php-c.html</link>
		<comments>http://blog.00rz.com/2010/10/%e8%87%aa%e5%a2%9e%e8%bf%90%e7%ae%97php-c.html#comments</comments>
		<pubDate>Fri, 15 Oct 2010 08:18:54 +0000</pubDate>
		<dc:creator>佳音</dc:creator>
				<category><![CDATA[c语言学习]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.00rz.com/?p=265</guid>
		<description><![CDATA[以前面试的时候老有人问  ++i 和 i++ 的问题， 每每心里都在暗暗想&#8230;, 1、这俩东西功能不一样。 2、 写代码的时候多放些注意力在别的地方比在这个地方纠结强。 我总认为， 可读性和扩展性好的代码  比 一堆 又烂又快的代码好。 3、不免俗的研究了一下。 对于C #include &#34;stdio.h&#34; &#160; int main&#40;int argc, char *argv&#91;&#93;&#41; &#123; &#160; &#160; int i = 0; &#160; &#160; &#160; int a = 0; &#160; &#160; int b = 0; &#160; &#160; &#160; a = i++; &#160; &#160; b= &#160;++i; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>以前面试的时候老有人问  ++i 和 i++ 的问题， 每每心里都在暗暗想&#8230;,<br />
1、这俩东西功能不一样。</p>
<p>2、 写代码的时候多放些注意力在别的地方比在这个地方纠结强。<br />
我总认为， 可读性和扩展性好的代码  比 一堆 又烂又快的代码好。</p>
<p>3、不免俗的研究了一下。</p>
<p>对于C</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;stdio.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> a = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> b = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; a = i++;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; b= &nbsp;++i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; i++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ++i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%d&quot;</span>,a<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%d&quot;</span>,b<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>汇编后</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .file&nbsp; &nbsp;&quot;test.c&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .section&nbsp; &nbsp; &nbsp; &nbsp; .rodata
</div>
</li>
<li class="li1">
<div class="de1">.LC0:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .string&nbsp;&quot;%d&quot;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; .text
</div>
</li>
<li class="li1">
<div class="de1">.globl main
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .type&nbsp; &nbsp;main, @function
</div>
</li>
<li class="li1">
<div class="de1">main:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; pushl&nbsp; &nbsp;%ebp
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %esp, %ebp
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; andl&nbsp; &nbsp; $-16, %esp
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; subl&nbsp; &nbsp; $32, %esp
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; $0, 28(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; $0, 24(%esp)
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; $0, 20(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; 28(%esp), %eax
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %eax, 24(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; addl&nbsp; &nbsp; $1, 28(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; addl&nbsp; &nbsp; $1, 28(%esp)
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; 28(%esp), %eax
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %eax, 20(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; addl&nbsp; &nbsp; $1, 28(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; addl&nbsp; &nbsp; $1, 28(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; $.LC0, %eax
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; 24(%esp), %edx
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %edx, 4(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %eax, (%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; call&nbsp; &nbsp; printf
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; $.LC0, %eax
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; 20(%esp), %edx
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %edx, 4(%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; movl&nbsp; &nbsp; %eax, (%esp)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; call&nbsp; &nbsp; printf
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; leave
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; ret
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .size&nbsp; &nbsp;main, .-main
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .ident&nbsp; &quot;GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5&quot;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .section&nbsp; &nbsp; &nbsp; &nbsp; .note.GNU-stack,&quot;&quot;,@progbits</div>
</li>
</ol>
</div>
<p>可以看出没有赋值操作的 自增运算 不管是 ++i 还是i++ 都会被会变成一条相同的汇编（addl	$1, 28(%esp)）<br />
如果有赋值操作的时候 汇编的条数是一样的 只是 几条语句的顺序不一样<br />
所以C中这两种格式区别仅在于生成的值, 所以在仅使用它们的副作用时, 二者 完全一样，</p>
<p>http://c-faq-chn.sourceforge.net/ccfaq/node46.htm</p>
<p>但是 C++同学的表现是不一样的有兴趣的同学google一下，</p>
<p>悲剧 刚才写的一段代码丢了<br />
简单说下php同学吧<br />
有兴趣的通许参阅一下php源码  大概在这个文件里zend_compile.c<br />
stackoverflow上有一些简单的说明:</p>
<p>http://stackoverflow.com/questions/1756015/whats-the-difference-between-i-and-i-in-php</p>
<p>原文有一段<br />
:For further clarification, post-incrementation in PHP has been documented as storing a temporary variable which attributes to this 10% overhead vs. pre-incrementation.</p>
<p>是说 post-incrementation i++ 比pre-incrementation ＋＋i 花费多10% 来存储一个临时变量。</p>
<p><map name='google_ad_map_265_4664d84c6fd17adb'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/265?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_265_4664d84c6fd17adb' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=265&amp;url= http%3A%2F%2Fblog.00rz.com%2F2010%2F10%2F%25e8%2587%25aa%25e5%25a2%259e%25e8%25bf%2590%25e7%25ae%2597php-c.html' /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.00rz.com/2010/10/%e8%87%aa%e5%a2%9e%e8%bf%90%e7%ae%97php-c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>struct 字节对齐</title>
		<link>http://blog.00rz.com/2010/04/struct-%e5%ad%97%e8%8a%82%e5%af%b9%e9%bd%90.html</link>
		<comments>http://blog.00rz.com/2010/04/struct-%e5%ad%97%e8%8a%82%e5%af%b9%e9%bd%90.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 14:29:12 +0000</pubDate>
		<dc:creator>佳音</dc:creator>
				<category><![CDATA[c语言学习]]></category>

		<guid isPermaLink="false">http://blog.00rz.com/2010/04/struct-%e5%ad%97%e8%8a%82%e5%af%b9%e9%bd%90.html</guid>
		<description><![CDATA[struct { char a; short b; int c; char d; } __attribute__((packed)) s]]></description>
			<content:encoded><![CDATA[<pre>struct {
	char a;
	short b;
	int c;
	char d;
} __attribute__((packed)) s</pre>
<p><map name='google_ad_map_210_4664d84c6fd17adb'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/210?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_210_4664d84c6fd17adb' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=210&amp;url= http%3A%2F%2Fblog.00rz.com%2F2010%2F04%2Fstruct-%25e5%25ad%2597%25e8%258a%2582%25e5%25af%25b9%25e9%25bd%2590.html' /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.00rz.com/2010/04/struct-%e5%ad%97%e8%8a%82%e5%af%b9%e9%bd%90.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C/C++堆、栈及静态数据区</title>
		<link>http://blog.00rz.com/2010/04/cc%e5%a0%86%e3%80%81%e6%a0%88%e5%8f%8a%e9%9d%99%e6%80%81%e6%95%b0%e6%8d%ae%e5%8c%ba.html</link>
		<comments>http://blog.00rz.com/2010/04/cc%e5%a0%86%e3%80%81%e6%a0%88%e5%8f%8a%e9%9d%99%e6%80%81%e6%95%b0%e6%8d%ae%e5%8c%ba.html#comments</comments>
		<pubDate>Sun, 04 Apr 2010 04:39:27 +0000</pubDate>
		<dc:creator>佳音</dc:creator>
				<category><![CDATA[c语言学习]]></category>

		<guid isPermaLink="false">http://blog.00rz.com/2010/04/cc%e5%a0%86%e3%80%81%e6%a0%88%e5%8f%8a%e9%9d%99%e6%80%81%e6%95%b0%e6%8d%ae%e5%8c%ba.html</guid>
		<description><![CDATA[引自http://www.cnw168.cn/china/zxjx/rjbc/c/20080114142636.htm 五大内存分区 在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆，就是那些由new分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。 自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。 全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。 常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改（当然，你要通过非正当手段也可以修改，而且方法很多） 明确区分堆与栈 在bbs上，堆与栈的区分问题，似乎是一个永恒的话题，由此可见，初学者对此往往是混淆不清的，所以我决定拿他第一个开刀。 首先，我们举一个例子： void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈，看到new，我们首先就应该想到，我们分配了一块堆内存，那么指针p呢？他分配的是一块栈内存，所以这句话的意思就是： 在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小，然后调用operator new分配内存，然后返回这块内存的首地址，放入栈中，他在VC6下的汇编代码如下： 00401028push14h 0040102Acalloperator new (00401060) 0040102Faddesp,4 00401032movdword ptr [ebp-8],eax 00401035moveax,dword ptr [ebp-8] 00401038movdword ptr [ebp-4],eax 这里，我们为了简单并没有释放内存，那么该怎么去释放呢？是delete p么？澳，错了，应该是delete []p，这是为了告诉编译器：我删除的是一个数组，VC6就会根据相应的Cookie信息去进行释放内存的工作。 好了，我们回到我们的主题：堆和栈究竟有什么区别？ 主要的区别由以下几点： 1 、管理方式不同； 2 、空间大小不同； 3 、能否产生碎片不同； 4 、生长方向不同； 5 、分配方式不同； 6 、分配效率不同； 管理方式：对于栈来讲，是由编译器自动管理，无需我们手工控制；对于堆来说，释放工作由程序员控制，容易产生memory leak。 空间大小：一般来讲在32位系统下，堆内存可以达到4G的空间，从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲，一般都是有一定的空间大小的，例如，在VC6下面，默认的栈空间大小是1M（好像是，记不清楚了）。当然，我们可以修改： [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-small;">引自<a href="http://www.cnw168.cn/china/zxjx/rjbc/c/20080114142636.htm" target="_blank">http://www.cnw168.cn/china/zxjx/rjbc/c/20080114142636.htm</a></span></p>
<p><span style="font-size: x-small;">五大内存分区<br />
在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。<br />
栈，就是那些由编译器在需要的时候分配，在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。<br />
堆，就是那些由new分配的内存块，他们的释放编译器不去管，由我们的应用程序去控制，一般一个new就要对应一个delete。如果程序员没有释放掉，那么在程序结束后，操作系统会自动回收。<br />
自由存储区，就是那些由malloc等分配的内存块，他和堆是十分相似的，不过它是用free来结束自己的生命的。<br />
全局/静态存储区，全局变量和静态变量被分配到同一块内存中，在以前的C语言中，全局变量又分为初始化的和未初始化的，在C++里面没有这个区分了，他们共同占用同一块内存区。<br />
常量存储区，这是一块比较特殊的存储区，他们里面存放的是常量，不允许修改（当然，你要通过非正当手段也可以修改，而且方法很多）<br />
明确区分堆与栈<br />
在bbs上，堆与栈的区分问题，似乎是一个永恒的话题，由此可见，初学者对此往往是混淆不清的，所以我决定拿他第一个开刀。<br />
首先，我们举一个例子：<br />
void f() { int* p=new int[5]; }<br />
这条短短的一句话就包含了堆与栈，看到new，我们首先就应该想到，我们分配了一块堆内存，那么指针p呢？他分配的是一块栈内存，所以这句话的意思就是： 在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小，然后调用operator new分配内存，然后返回这块内存的首地址，放入栈中，他在VC6下的汇编代码如下：<br />
00401028push14h<br />
0040102Acalloperator new (00401060)<br />
0040102Faddesp,4<br />
00401032movdword ptr [ebp-8],eax<br />
00401035moveax,dword ptr [ebp-8]<br />
00401038movdword ptr [ebp-4],eax<br />
这里，我们为了简单并没有释放内存，那么该怎么去释放呢？是delete p么？澳，错了，应该是delete []p，这是为了告诉编译器：我删除的是一个数组，VC6就会根据相应的Cookie信息去进行释放内存的工作。<br />
好了，我们回到我们的主题：堆和栈究竟有什么区别？<br />
主要的区别由以下几点：<br />
1 、管理方式不同；<br />
2 、空间大小不同；<br />
3 、能否产生碎片不同；<br />
4 、生长方向不同；<br />
5 、分配方式不同；<br />
6 、分配效率不同；<br />
管理方式：对于栈来讲，是由编译器自动管理，无需我们手工控制；对于堆来说，释放工作由程序员控制，容易产生memory leak。<br />
空间大小：一般来讲在32位系统下，堆内存可以达到4G的空间，从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲，一般都是有一定的空间大小的，例如，在VC6下面，默认的栈空间大小是1M（好像是，记不清楚了）。当然，我们可以修改：<br />
打开工程，依次操作菜单如下：Project-&gt;Setting-&gt;Link，在Category 中选中Output，然后在Reserve中设定堆栈的最大值和commit。<br />
注意：reserve最小值为4Byte；commit是保留在虚拟内存的页文件里面，它设置的较大会使栈开辟较大的值，可能增加内存的开销和启动时间。<br />
碎片问题：对于堆来讲，频繁的new/delete势必会造成内存空间的不连续，从而造成大量的碎片，使程序效率降低。对于栈来讲，则不会存在这个问题， 因为栈是先进后出的队列，他们是如此的一一对应，以至于永远都不可能有一个内存块从栈中间弹出，在他弹出之前，在他上面的后进的栈内容已经被弹出，详细的 可以参考数据结构，这里我们就不再一一讨论了。<br />
生长方向：对于堆来讲，生长方向是向上的，也就是向着内存地址增加的方向；对于栈来讲，它的生长方向是向下的，是向着内存地址减小的方向增长。<br />
分配方式：堆都是动态分配的，没有静态分配的堆。栈有2种分配方式：静态分配和动态分配。静态分配是编译器完成的，比如局部变量的分配。动态分配由alloca函数进行分配，但是栈的动态分配和堆是不同的，他的动态分配是由编译器进行释放，无需我们手工实现。<br />
分配效率：栈是机器系统提供的数据结构，计算机会在底层对栈提供支持：分配专门的寄存器存放栈的地址，压栈出栈都有专门的指令执行，这就决定了栈的效率比 较高。堆则是C/C++函数库提供的，它的机制是很复杂的，例如为了分配一块内存，库函数会按照一定的算法（具体的算法可以参考数据结构/操作系统）在堆 内存中搜索可用的足够大小的空间，如果没有足够大小的空间（可能是由于内存碎片太多），就有可能调用系统功能去增加程序数据段的内存空间，这样就有机会分 到足够大小的内存，然后进行返回。显然，堆的效率比栈要低得多。<br />
从这里我们可以看到，堆和栈相比，由于大量new/delete的使用，容易造成大量的内存碎片；由于没有专门的系统支持，效率很低；由于可能引发用户态 和核心态的切换，内存的申请，代价变得更加昂贵。所以栈在程序中是应用最广泛的，就算是函数的调用也利用栈去完成，函数调用过程中的参数，返回地 址，EBP和局部变量都采用栈的方式存放。所以，我们推荐大家尽量用栈，而不是用堆。<br />
虽然栈有如此众多的好处，但是由于和堆相比不是那么灵活，有时候分配大量的内存空间，还是用堆好一些。<br />
无论是堆还是栈，都要防止越界现象的发生（除非你是故意使其越界），因为越界的结果要么是程序崩溃，要么是摧毁程序的堆、栈结构，产生以想不到的结果,就算是在你的程序运行过程中，没有发生上面的问题，你还是要小心，说不定什么时候就崩掉，那时候debug可是相当困难的</span></p>
<p><map name='google_ad_map_207_4664d84c6fd17adb'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/207?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_207_4664d84c6fd17adb' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=207&amp;url= http%3A%2F%2Fblog.00rz.com%2F2010%2F04%2Fcc%25e5%25a0%2586%25e3%2580%2581%25e6%25a0%2588%25e5%258f%258a%25e9%259d%2599%25e6%2580%2581%25e6%2595%25b0%25e6%258d%25ae%25e5%258c%25ba.html' /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.00rz.com/2010/04/cc%e5%a0%86%e3%80%81%e6%a0%88%e5%8f%8a%e9%9d%99%e6%80%81%e6%95%b0%e6%8d%ae%e5%8c%ba.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于堆栈</title>
		<link>http://blog.00rz.com/2010/04/%e5%85%b3%e4%ba%8e%e5%a0%86%e6%a0%88.html</link>
		<comments>http://blog.00rz.com/2010/04/%e5%85%b3%e4%ba%8e%e5%a0%86%e6%a0%88.html#comments</comments>
		<pubDate>Sun, 04 Apr 2010 04:33:31 +0000</pubDate>
		<dc:creator>佳音</dc:creator>
				<category><![CDATA[c语言学习]]></category>

		<guid isPermaLink="false">http://blog.00rz.com/?p=204</guid>
		<description><![CDATA[一个进程的内存空间可以在逻辑上分成3个部份：代码区，静态数据区和动态数据区，静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈 (stack)”和“堆(heap)”是两种不同的动态数据区，栈是一种线性结构，堆是一种链式结构。进程的每个线程都有私有的“栈”，所以每个线程虽然 代码一样，但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区，本地变量分配在动态数 据区，即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 通常栈的空间较小不能再栈上分配很大的内存空间（栈只有1-2MB的大小），而堆可以在内存允许的情况下分配大内存空间 栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。 堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事]]></description>
			<content:encoded><![CDATA[<p>一个进程的内存空间可以在逻辑上分成3个部份：代码区，静态数据区和动态数据区，静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈 (stack)”和“堆(heap)”是两种不同的动态数据区，栈是一种线性结构，堆是一种链式结构。进程的每个线程都有私有的“栈”，所以每个线程虽然 代码一样，但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区，本地变量分配在动态数 据区，即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。</p>
<p>通常栈的空间较小不能再栈上分配很大的内存空间（栈只有1-2MB的大小），而堆可以在内存允许的情况下分配大内存空间</p>
<p>栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。<br />
堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事</p>
<p><map name='google_ad_map_204_4664d84c6fd17adb'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/204?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_204_4664d84c6fd17adb' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=204&amp;url= http%3A%2F%2Fblog.00rz.com%2F2010%2F04%2F%25e5%2585%25b3%25e4%25ba%258e%25e5%25a0%2586%25e6%25a0%2588.html' /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.00rz.com/2010/04/%e5%85%b3%e4%ba%8e%e5%a0%86%e6%a0%88.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

