c语言的全局域空间是如何实现的?

zeloas 2007-03-06 06:14:08
c语言的全局变量是如何存储的?
存储全局变量的空间大小是固定的还是动态分配的?为什么?
如果是动态分配的,那么一般有多大?
...全文
353 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
如果需要更进一步了解,
建议楼主看看 编译原理 ~

^_^
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
计算机理解力是没法和我们相比的,但是它比我们快。我们可以把这些变量分开来放,从不同地方取来的就是不同的变量。告诉计算机去找的就是符号表。当然,生成符号表是编译器的事,我们不用管。但是了解一点总是有好处的。这里我以Unix ELF (Executalbe and Linkable Format)格式文件为例说明编译器是怎么安排全局变量,静态变量和自动变量的位置的。
ELF可重定位目标文件包括:ELF头以及.text,.rodata, .data ,.bss ,.symtab, .rel.text, .rel.data 等节。
全局变量:已初始化的保存在.data段中 ,未初始化的表示为.bss段的一个占位符;
静态变量:根据是否初始化分别在.data 和.bss段中分配空间;
自动变量(非静态局部变量):在运行时保存在栈中。既不在.data 段中也不在.bss段中。
其实我们可以编写一个简单的程序,编译了以后用objdump命令查看。
知道了各种变量在运行时的位置也就知道了他们的储存期,而且了解变量的位置对编写高性能程序也非常有帮助。
我们知道嵌入式对程序的性能要求是非常高的,函数的参数列表越长那么函数调用的开销就越大,这个时候我们可以使用全局变量提高程序的性能。
将函数和变量声明为static可防止函数和变量被其它模块不正确的使用。
关于自动变量,请看下面的两个程序:
long product;
void factorialA(long n)
{
long i;
for(i = 1; i <= n;i++ ){
product *= i;
}
void factorialB(long n)
{
long i;
long x = 1;
for(i = 1; i <= n;i++ ){
x *= i;
}
product = x;
}
在n值较大的时候,上面两个程序的性能是有显著差别的。 这是利用了程序的局部性原理
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
动态也是可以地吧,定义全局的指针变量,然后malloc,以前的c可能不行
=================================
那就是只有指针是 全局的,
指向的空间不是全局的(虽然是全局有效,但是只要是动态分配的就都是全局有效的)
jixingzhong 2007-03-06
  • 打赏
  • 举报
回复
全局变量被存储在数据段,大小自然是静态的,也就是你定义的大小。
happytang 2007-03-06
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5359/5359624.xml?temp=.8627283
happytang 2007-03-06
  • 打赏
  • 举报
回复
全局变量最好还是静态分配,大小就是固定地;
动态也是可以地吧,定义全局的指针变量,然后malloc,以前的c可能不行
看系统内存能承受多大了,几十M我也申请过
goodluckyxl 2007-03-06
  • 打赏
  • 举报
回复
全局变量看你自己申请了
可以固定可以不固定啊
没有经验值 看你自己需要了
有些程序可能开个1-10k就够了
有些则需要1-10m

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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