zoukankan      html  css  js  c++  java
  • 深入理解程序的结构

    传统上,一个程序一般会有这几个段: .test, .data, .bss段。下面就来说一说各段的作用是什么,以此了解c语言中的各元素(函数和变量)是被放在哪一个段中的。

    指令段:

    地改写。

    处理器所需加工的数据是放在.data,.bss,.rdata段的。当然,除了这几个段外,数据也可以来自堆和栈(这个之后再做讨论)。下面通过例子例子来了解各段中存放的是C语言中什么类型的数据。

    eg:

    #include<stdio.h>
    
    int main()
    {
        
       return(0);
    }

    现在我们定义两个全局变量:

    #include<stdio.h>
    
    int g_non=0x1234;
    int g_zero=0;
    int main()
    {
        
       return(0);
    }

    此时发现,data和bss段大小发生了改变。对于初始化不为0的全局变量,编译器会把它放入data段,而对于初始化为0的全局变量,会被放入bss段。实际上,没有初始化的全局变量也像初始化为0的全局变量一样,放在bss段。

     

    小端模式,低位在前,高位在后。

    由于bss段中存放的数据是初始化为0或者没有初始化好的,所以不需要像data段那样存放在程序文件中。

    至于data段数据的初始化,是引导加载器加载程序时,通过程序文件中data段的数据复制到所对应的内存地址空间,从而一次性完成所有变量的初始化。通过nm工具(使用nm之前不能使用trip命令哦),我们可以验证两个变量的所分配的段信息。

     

    #include<stdio.h>
    
    
    int main()
    {
        static int g_non=0x123456;
        static int g_zero=0;
           return(0);
    }

    对于静态局部变量,编译器为之分配的内存空间与全局变量是一样的。

    data段大小为d,刚好13字节,正是字符串的所有字符的个数,包含结尾。

    现在增加const关键字:

    #include<stdio.h>
    
    const char g_char[]="hello world!";
    int main()
    {
    
           return(0);
    }

     

  • 相关阅读:
    ICQ
    Create小程序
    LRU最近最少使用算法
    感知器
    聚类-K均值
    阈值分类法
    最邻近分类
    设计模式
    高级排序算法
    Socket编程
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7270282.html
Copyright © 2011-2022 走看看