• 程序中内存从哪里来3


    代码段、数据段、bss段
    1、
    (1)编译器在编译程序的时候,将程序中的所有元素分成了一些组成部分,各部分构成一个段,所以说 段是可执行程序的组成部分。
    (2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
    (3)数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:
    全局变量才算是程序中的数据,局部变量不算程序的数据,只能算是函数的数据)
    (4)bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上就属于数据段,bss段就是被初始化为0的数据段。
    注意区分:数据段(.date)和bss段的区别与联系:二者本来没有本质区别,都是用来存放C程序中的全局变量的。区别在于
    把显式初始化为非0的全局变量存在.date段中,而把显式初始化为0或者是并未显式初始化(C语言规定未显式初始化的全局变量值默认为0)的全局变量存在bss段。
    2、有些特殊数据会被放到代码段
    (1)C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
    (2)const型常量:C语言中const关键字用来定义常量,常量就是不能被改变的量。const的实现方法至少有2种:第一种就是编译器将const修饰的变量放在代码段以
    实现不能修改(普遍见于各种单片机的编译器);第二种就是编译器来检查以确保const型的常量不会被修改,实际上const型的常量还是和普通变量一样
    放在数据段的(gcc中就是这样实现的)。
    3、显式初始化为非0的全局变量和静态局部变量放在数据段
    (1)放在.date段的变量有2种:第一种是显式初始化为非0的全局变量。第二种就是静态局部变量,也就是static修饰的局部变量。(普通局部变量分配在栈上,
    静态局部变量分配在.date段)。
    4、未初始化或者是显式初始化为0的全局变量放在bss段
    (1)bss段和.date段并没有本质区别,几乎可以不用明确去区分这两种。
    5、总结:C语言中所有变量和常量所使用的内存无非就是三种情况:堆、栈、数据段
    (1)相同点:三种获取内存的方法,都可以给程序提供可用内存,都可以用来定义变量给程序用
    (2)不同点:栈内存对应C语言中的普通局部变量(别的变量还用不了栈,而且栈是自动的,由编译器和运行时环境共同来提供服务的,程序员无法手工控制);堆内存
    完全独立于我们的程序存在和管理的,程序需要内存时可以手工申请malloc,使用完后必须尽快free释放;数据段对于程序来说对应C语言程序中的全局变量和静态局部变量。
    6、
    (1)函数内部临时使用,出了函数不会用到,就定义局部变量
    (2)堆内存和数据段几乎拥有完全相同的属性,大部分时候是可以完全替换的。但是生命周期不一样。堆内存的生命周期是从malloc开始到free结束,
    而全局变量是从整个程序一开始执行就开始,直到程序结束才消灭。提示:如果你的变量只是程序的一个阶段有用,用完就不用了,就适合堆内存;如果这个变量本身和程序
    是一生相伴的,那就适合用全局变量。(堆内存就好像租房、数据段就好像买房);
    (3)慢慢会发现,堆内存的使用比全局变量广泛。

  • 相关阅读:
    当前日志损坏解决一例
    Oracle 1204 RAC failover 测试 (一)
    Logical standby跳过个别SQL不Apply的测试
    Data guard 又出问题了
    CPIO无反应
    回答棉花糖先生关于我说的DB自动增加Index的问题
    SSD硬盘,先不要用在Server上
    ORA00304: requested INSTANCE_NUMBER is busy,终于解决
    .Net运行时的相互关系
    CSS布局探密04
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11650736.html
Copyright © 2020-2023  润新知