﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-长寿梦的cppblog-文章分类-C/C++知识点总结</title><link>http://www.cppblog.com/changshoumeng/category/13691.html</link><description>键盘为琴，代码作曲，
悠悠，是我的心，
在为你弹奏

从main开始，无限循环，
无限等待，唯你
是我的常量
</description><language>zh-cn</language><lastBuildDate>Sat, 08 May 2010 05:46:02 GMT</lastBuildDate><pubDate>Sat, 08 May 2010 05:46:02 GMT</pubDate><ttl>60</ttl><item><title>程序的内存分配</title><link>http://www.cppblog.com/changshoumeng/articles/114804.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Sat, 08 May 2010 00:01:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/articles/114804.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/114804.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/articles/114804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/114804.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/114804.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <p><font size=3><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序的内存分配</strong></font><br><br>&lt;资源来自网络，感谢原创者分享，共同学习！&gt;<br><br>一个由c/C++编译的程序占用的内存分为以下几个部分<br><font color=#0000ff>1、栈区（stack）—</font> 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。<br><font color=#0000ff>2、堆区（heap）</font> — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br><font color=#0000ff>3、全局区（静态区）（static）—，</font>全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放<br><font color=#0000ff>4、文字常量区</font> —常量字符串就是放在这里的。 程序结束后由系统释放<br><font color=#0000ff>5、程序代码区</font>—存放函数体的二进制代码。</p>
            <p><font size=4><strong>堆和栈的理论知识</strong></font><br><font color=#0000ff>2.1申请方式</font><br><font color=#ff00ff>stack:<br><u>由系统自动分配。</u></font> 例如，声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间<br><font color=#ff0000>heap:<br>需要程序员自己申请</font><font color=#ff0000>，并指明大小，在c中malloc函数</font><br>如p1 = (char *)malloc(10);<br>在C++中用new运算符<br>如p2 = (char *)malloc(10);<br>但是注意p1、p2本身是在栈中的。<br>2.2<font color=#0000ff>申请后系统的响应</font><br>栈：<font color=#ff00ff>只要栈的剩余空间大于所申请空间</font>，系统将为程序提供内存，否则将报异常提示栈溢出。<br>堆：<font color=#ff0000>首先应该知道操作系统有一个记录空闲内存地址的链表</font>，当系统收到程序的申请时，<br>会 遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内 存空间中的首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大 小，系统会自动的将多余的那部分重新放入空闲链表中。<br><font color=#0000ff>2.3申请大小的限制</font><br><font color=#ff00ff>栈：在Windows下,栈是向低地址扩展的数据结构，是一块 连续的内存的区域</font>。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在 WINDOWS下，栈的大小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因 此，能从栈获得的空间较小。<br><font color=#ff0000>堆：堆是向高地址扩展的数据结构，是不连续的内存区域。</font>这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。<br><font color=#0000ff>2.4申请效率的比较：<br></font><font color=#ff00ff>栈由系统自动分配，速度较快。但程序员是无法控制的。</font><br><font color=#ff0000>堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.</font><br>另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度， 也最灵活<br><font color=#0000ff>2.5堆和栈中的存储内容</font><br>栈： 在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。<br>当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。<br>堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。<br><font color=#0000ff>2.6存取效率的比较</font><br><br>char s1[] = "aaaaaaaaaaaaaaa";<br>char *s2 = "bbbbbbbbbbbbbbbbb";<br>aaaaaaaaaaa是在运行时刻赋值的；<br>而bbbbbbbbbbb是在编译时就确定的；<br>但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。<br>比如：<br>#include<br>void main()<br>{<br>char a = 1;<br>char c[] = "1234567890";<br>char *p ="1234567890";<br>a = c[1];<br>a = p[1];<br>return;<br>}<br>对应的汇编代码<br>10: a = c[1];<br>00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br>0040106A 88 4D FC mov byte ptr [ebp-4],cl<br>11: a = p[1];<br>0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br>00401070 8A 42 01 mov al,byte ptr [edx+1]<br>00401073 88 45 FC mov byte ptr [ebp-4],al<br>第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指edx中，在根据edx读取字符，显然慢了。<br><br><strong>2.7小结：</strong><br>堆和栈的区别可以用如下的比喻来看出：<br><font color=#ff00ff>使用栈就象我们去饭馆里吃饭</font>，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，<font color=#ff00ff>他的好处是快捷，但是自由度小。</font><br><font color=#ff0000>使用堆就象是自己动手做喜欢吃的菜肴</font>，比较麻烦，但是比<font color=#ff0000>较符合自己的口味，而且自由度大</font>。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/changshoumeng/aggbug/114804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-05-08 08:01 <a href="http://www.cppblog.com/changshoumeng/articles/114804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详细解说 STL 排序(Sort)</title><link>http://www.cppblog.com/changshoumeng/articles/114379.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Tue, 04 May 2010 14:51:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/articles/114379.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/114379.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/articles/114379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/114379.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/114379.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 详细解说 STL 排序(Sort)&nbsp;0 前言: STL，为什么你必须掌握... 11 STL提供的Sort 算法 &nbsp;-------------------------------------------------------------------------------- 21.1 所有sort算法介绍... 21.2 sort 中的比较函数... 2...&nbsp;&nbsp;<a href='http://www.cppblog.com/changshoumeng/articles/114379.html'>阅读全文</a><img src ="http://www.cppblog.com/changshoumeng/aggbug/114379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-05-04 22:51 <a href="http://www.cppblog.com/changshoumeng/articles/114379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编程技术</title><link>http://www.cppblog.com/changshoumeng/articles/114173.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Sun, 02 May 2010 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/articles/114173.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/114173.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/articles/114173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/114173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/114173.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;C++编程技术&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/changshoumeng/articles/114173.html'>阅读全文</a><img src ="http://www.cppblog.com/changshoumeng/aggbug/114173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-05-02 16:29 <a href="http://www.cppblog.com/changshoumeng/articles/114173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++类对象的复制－拷贝构造函数</title><link>http://www.cppblog.com/changshoumeng/articles/114015.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Fri, 30 Apr 2010 01:00:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/articles/114015.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/114015.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/articles/114015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/114015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/114015.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 普通对象和类对象同为对象，他们之间的特性有相似之处也有不同之处，类对象内部存在成员变量，而普通对象是没有的，当同样的复制方法发生在不同的对象上的时候，那么系统对他们进行的操作也是不一样的，就类对象而言，相同类型的类对象是通过拷贝构造函数来完成整个复制过程的，在上面的代码中,我们并没有看到拷贝构造函数，同样完成了复制工作，这又是为什么呢？因为当一个类没有自定义的拷贝构造函数的时候系统会自动提供一个默...&nbsp;&nbsp;<a href='http://www.cppblog.com/changshoumeng/articles/114015.html'>阅读全文</a><img src ="http://www.cppblog.com/changshoumeng/aggbug/114015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-04-30 09:00 <a href="http://www.cppblog.com/changshoumeng/articles/114015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>