Bootstrap

const、static变量存放位置

理论在后面。

我们将以下面的例子介绍const变量和static变量的存放位置:

static int  val_a = 1 ; // 初始化的静态变量 

int  val_b = 2 ;        // 全局变量 

const int  val_c = 3 ;  // const 全局变量 

static int  val_d ;     // 未初始化的静态变量 

int  val_e ;            // 未初始化的全局变量

int main()

{

    static int val_f = 5;  // 初始化的局部静态变量

    static int val_g;      //未初始化局部静态变量

    int    val_h = 6;      //初始化局部变量

    int    val_i;          //未初始化局部变量

    const  int val_j = 7;  //const局部变量

    return 0;

}

①static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:val_a、val_d、val_f、val_g。

②const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;const局部变量存储在栈中,代码块结束时释放,例如:val_j。

③全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:val_b、val_e。

④局部变量存储在栈中,代码块结束时释放,例如:val_h、val_i。

注:当全局变量和静态局部变量未赋初值时,系统自动置为0。


我们说的data(初始化的段)   bbs段(未初始化的段) 都是针对全局变量和静态变量来说的.

data又分为读写数据段(rw data) 和 只读数据段(ro data)

bbs是未初始化的全局变量和静态变量和 初始化为0 的全局变量和静态变量.

我们在函数里面的定义的局部变量(除static xxx)都是在stack or  heap里面.  

bbs段不影响a.out的大小,bbs段的数据用占位符标示而已,不在a.out里面.运行才产生.

stack heap也都是在运行的时候产生.


堆栈区(stack),堆栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等.栈的申请是由系统自动分配,如在函数内部申请一个局部变量 int h,同时判别所申请空间是否小于栈的剩余空间,如若小于的话,在堆栈中为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。  

其次是堆(heap),堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。堆的申请是由程序员自己来操作的,在C中使用malloc函数,而C++中使用new运算符,但是堆的申请过程比较复杂。



;