/
...
/
/
六. 内存模型
Search
Try Notion
六. 内存模型
inclue/cpp文件问题
📂include包含内容
函数原型
#define符号常量
类/结构声明
模板声明
内联函数(包括类内联)
📂cpp包含内容
所有声明对应的函数定义(除了内联)
单定义规则
不要用include包含cpp会导致多重定义 C++仅允许定义一次
IDE中,不要将项目文件包含.h文件
使用#ifndef...来防止.h文件被引用两次
对于外部变量/函数采用extern来引用声明,避免重复定义
作用域/链接性
定义:链接性表示标识符能否在不同文件中共享
外部:可在文件间共享 ——-无前缀函数外定义变量和无前缀函数
内部:只能在当前文件中访问
无链接性:只能在当前代码块访问()
语言间链接性
比如C++要调用C中函数,由于编译器内部实现不同,同名函数的内部函数名也不同
可通过 extern "C" void fun1(...) extern "C++" void fun2(...) 来准确调用和链接
变量/函数持续性
自动持续性
范围:函数中声明变量(1种)
意义:在定义时候被创建,函数或代码段结束后销毁
作用域持续时间都在代码块内部
嵌套代码块时候,同名标识符时,隐藏相对外部的
register在C++中仅用作自动声明的显式关键字,无优化方面意义
auto 用作显式自动声明意义取消,另作他用
静态持续性
范围:函数外定义变量和使用static 的关键
无前缀函数外—外部链接性
static 函数外—-内部链接性/匿名函数空间
static 函数内—-无链接性
💡
区别自动变量,虽然作用域相同,但是持续性不同,一个立马被销毁,一个一直持续
意义:整个程序过程中一直存在
对于静态变量,如果没有手动初始化,则系统自动初始化为0
对于函数而言,由于不能在函数里面定义函数,默认都是静态持续性且外部可连接
动态
分配时候创建,直到手动销毁
new手动分配,在堆(heap)中
由new delete 控制,不受作用域规则控制
(但用于跟踪的指针是受控的)
故可在一个函数中创建,另一个函数释放
定位new运算符
myclass *a = new(buffer) myclass(5) ; 其中new([address]) 就是定位new运算符
不能被和delete搭配使用,要销毁对象时候需要显式调用析构函数如a->~myclass
限定符
volatile
意义:可能有外部因素(非程序),改变变量的值
功能:不对其进行优化
mutable
对于const类对象,其某个成员依旧可以改变
const
虽然是说明符,但是对链接性有影响
const int a = 50 默认内部链接性 等价于static const int a = 50
要使其有外部链接性,定义时加入extern 比如extern const int a = 50
命名空间
三个区域
空间:声明区域>潜在作用域>作用域
声明区域:
某种存储加链接性的变量类型其声明区域是固定的
有文件内和代码块两种
保证了不同声明区域,不会冲突
潜在作用域:其有可能作用域为定义到声明区域结尾
作用域:在潜在作用域中很可能被隐藏,剩下的即为变量作用域
名称空间
可以自己定义新的声明区域,并命名它
using声明
将特定名称加入本名称空间,就像在该名称空间声明一样
不允许同名变量/函数
using编译
像每条语句都加入域解析符号:: 一样
同名时,局部的会把using编译(相对外部)的隐藏
有可能造成错误而编译器不警告