免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1462 | 回复: 5
打印 上一主题 下一主题

衣兜GG 看看这个问题建议一下我应该看什么书! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-13 21:24 |只看该作者 |倒序浏览
求助
深入理解计算机系统
如果这个问题还不能解决
我将请教大虾们
谢谢

C语言的书里面没讲这些东西!
我想把这样的问题具体化,理解了以后方便俺搞嵌入式呀!

[ 本帖最后由 zenglei421 于 2009-6-14 21:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-06-13 22:09 |只看该作者

回复 #1 zenglei421 的帖子

貌似这本书也没怎么讲呀
郁闷

论坛徽章:
0
3 [报告]
发表于 2009-06-13 22:19 |只看该作者

回复 #2 zenglei421 的帖子

变量常量 在内存里面的分布 ? 编译的时候,先编译为汇编文件,那么 C程序里面的 变量常量 和 汇编里面的数据段 BSS 段  文本段 是怎么个对应关系
C 程序里面的堆栈里面的数据 在汇编里面 怎么表示的?
我的意思是 要是有个程序 局部变量 全局变量 函数 什么之类的 在内存里面的分布

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
    自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
一般认为在c中分为这几个存储区:
     1. 栈 --有编译器自动分配释放
     2. 堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
     3. 全局区(静态区) -- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
     4. 另外还有一个专门放常量的地方。程序结束释放
    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
代码:
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}


    还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
    栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
    堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
    在栈上存取数据比通过指针在堆上存取数据快些。
    一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。


看了上面的分布 但是我想 编译为汇编文件的话 静态动态  堆栈 对应的汇编里面的 BBS段 code段 data段 是怎么个对应情况?
请高手解答呀 !我也不知道我说清楚了没有

论坛徽章:
0
4 [报告]
发表于 2009-06-14 10:40 |只看该作者
你看一下连接器就明白了。
需要有个连接脚本的。

论坛徽章:
0
5 [报告]
发表于 2009-06-14 16:50 |只看该作者

回复 #4 emmoblin 的帖子

看链接文件么?
有没有具体的例子讲这个的呀
貌似很多C语言的书都不讲这个的
谢谢哈

论坛徽章:
0
6 [报告]
发表于 2009-06-14 21:08 |只看该作者

回复 #4 emmoblin 的帖子

我看了下链接方面的东西
我的问题分为几部分  
1.编译预处理原理  (最好有个例子的那种资料)
2.编译的时候是怎么回事( 最好友例子讲 C程序 里面的 变量 怎么个分布 成 汇编文件的,那些分配到堆栈上的空间汇编文件是怎么知道的)
3.汇编的时候  汇编器怎么把汇编编译为机器码的(有个helloworld的例子就好了)
4.这个时候才涉及链接器  这个链接器是怎么工作的 (有利于理解静态动态链接)(那位大侠有这方面的研究)
一个c程序 经过这3步 成为了机器码  我想有个概念 对这中间的每一步 之间的对应关系
有没有什么好的 资料 呀 (最想要个用例子讲解的书 )
谢谢啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP