9 内存模型

头文件: 头文件通常包含以下内容:
函数原型
使用#define 或const定义的符号常量
结构声明
类声明
模板声明
内联函数

存储连续性、作用域和链接性

存储连续性

(C++有三种(C++11有四种)方案存储数据)

  1. 自动存储持续性:有两种变量是自动存储连续性:自动变量、寄存器变量
    在函数定义中声明的变量(包括形参)的存储连续性为自动的。默认情况下,作用域为局部,没有链接性。
    位置: 自动变量的存储位置为栈,栈的空间栈顶为高地址,栈底为低地址。

  2. 静态存储连续性:
    在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都是静态的。在程序运行期间都存在。其提供了三种链接性:外部链接性(可在其他文件访问(在代码块外面声明它,不可加static修饰))、内部链接性(只能在当前文件中访问(代码块外声明,并使用static 修饰))、无链接性(只能在当前代码块访问(在代码块内,并用static 修饰))。若没有初始化,其值默认为0。

  3. 线程存储持续性(C++11):
    变量如是使用关键字thread_local 声明的则其声明周期和线程一样。

  4. 动态存储持续性:
    new 运算符分配的内存会一直存在,直到用delete 或程序结束为止。

作用域和链接

作用域描述了名称在文件的多大范围可见。
链接性描述了名称如何在不同文件间共享。

作用域为局部的变量只能在定义它的代码块可用。作用域为全局变量在定义位置到 文件结尾可用。在函数原型作用域使用的名称可在包含参数列表的括号内可用。

若我们需要定义一个全局变量,该怎么办?

1. 链接性为外部

在每个使用外部变量的文件中,都必须声明它,同时,变量只能定义一次定义给变量分配空间,声明不分配空间,它引用已有的变量。所以要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义,其他文件必须使用extern 声明。

2. 链接性为内部

  1. 若内部链接性,则可以使用static 限定其只在该文件有效。当与外部链接性的同名,则屏蔽外部链接性的全局变量。
  2. const影响存储类型,默认下全局变量链接性为外部,但是const全局变量为内部,和static类似。
    使用:若需要在其他文件使用,则需要将其放在头文件中,若其存储类型为外部,在头文件定义则会产生二次定义错误,所以其为内部链接性
    若需要将其设置为外部链接性,则定义如下 extern const a=0;此定义只能有一次,否则产生二次定义错误,则其他文件只能声明该常量。
    在代码块中定义的const只能在该代码块有效。

函数链接性

**函数的存储类型为外部存储类型,所以可以用extern声明(可选的,也可以不声明直接使用)。**可以使用static使得其为内部链接性。

语言链接性

因为在编译器中不同语言编译器的翻译不同,所以在链接程序寻找与C++函数调用匹配的函数时,C中编译的函数可能找不到。
方法:

extern "C" void spiff(int);//使用C语言链接性
extern "C++" void spaff(int);//使用C++语言连接性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值