变量的存储方式及作用域

来源:互联网 发布:快客淘宝软件 编辑:程序博客网 时间:2024/06/11 02:30

C、C++、OC编译的程序占用内存的分布结构如下图所示:


栈区(stack),先进后出、后进先出。由系统自动分配,一般存放函数参数值、局部变量值等,由编译器自动创建与释放。

堆区(heap),大小可变。程序员手动向系统申请并指明大小,并且手动释放。若不释放,程序结束时可能会由OS回收。操作系统有一个记录空闲内存地址的链表,当接收到程序分配内存的申请时,系统遍历链表找到一个大小大于申请内存的空闲内存地址纪录时,从该链表中删除该节点,并将该节点记录的内存地址分配给程序。

全局区/静态区:全局变量和静态变量存储于该区域。不过初始化的全局变量和静态变量存储在一块,未初始化的全局变量和静态变量存储在一块。程序结束后由系统释放。

文字常量区:主要存储字符串常量。程序结束后由系统释放。

程序代码区:主要存放二进制代码。

前辈的经典代码:

//main.cppint 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在常量区,这个函数的作用是将"123456" 这串字符串复制一份放在p1申请的10个字节的堆区域中。    // p3指向的"123456"与这里的"123456"可能会被编译器优化成一个地址。}


1、变量的作用域即变量声明后可访问到该变量的范围。分为全局变量、局部变量、外部变量三种。

全局变量,从该变量的声明起到本文件的结尾均可访问,作用域内其它的类、函数均可对其进行读、写。存放于全局/静态区;

局部变量,只在相应的函数体内,从该变量的声明起到函数体的结尾可访问,作用域内可对其进行读、写。存放于栈区;

外部变量,不仅在本文件中可以访问,在其它文件中也可访问,作用域内的类、函数均可对其进行读、写。存放于全局/静态区;

成员变量,类对象的成员变量,C++中有private、protect、public三种,oc中public成员变量由public实现,protect、private由成员变量位置决定。对内来说,成员变量对于该类对象的所有类方法、对象方法均有效;对外则要根据关键字及声明位置来决定其对外作用域。存放于堆区;

同一文件中,当全局变量与局部变量相遇,局部变量会屏蔽全局变量。

2、变量的存储方式即该变量究竟对应于物理内存哪种区域。C语言四种存储类型:自动存储变量、静态存储变量、外部存储变量、寄存器存储变量。

自动存储变量,作用域为变量定义所在的模块或函数内,生存期为该变量声明所在的函数或模块的执行周期,存储区域则一般位于栈区。缺省关键字为auto。存放于栈区;

静态存储变量,作用域为变量原来的作用域,存储区域则指定位于全局区/静态区,而生存期则变为整个应用程序的生命周期。关键字为static。存放于全局/静态区;

外部存储部量,使用extern来引用声明于别文件的变量,作用域为整个应用程序,生存期为整个应用程序的生命周期。存放于全局/静态区;

寄存器存储变量,寄存器存取效率更高,常用于循环控制,使用SI、DI寄存器。


0 0
原创粉丝点击