内存模型和名称空间

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

自动存储变量

​ 如果在函数之前声明一个变量,然后在函数内又声明了同一个变量,则编译器会暂时隐藏外面的变量,在函数结束之后,恢复之前的变量。

​ 由于自动变量的数目一直在变化,所以程序留出一段内存,将其视为栈来管理变量的增减,栈是先入后出,函数调用将参数放到栈顶,函数从左到右被压进栈中,结束之后栈顶指针缩回原来的位置。

寄存器变量

寄存器变量建议编译器使用CPU寄存器在存储自动变量

声明方式是 register int temp;

目的是为了提高访问的速度。

静态持续变量 -static

静态存储变量有3种连接性:外部链接性(可以在其他文件中访问),内部链接性(只能在当前文件中访问),无链接性(只能在当前代码块中访问)

静态变量的数目在程序运行期间不会变化,所以编译器分配固定的内存块来储存所有的静态变量,静态变量的初始值为0。(静态变量的0初始化性)

定义方式:

int a;//这个是外部链接的变量
static int b;//这是内部链接的变量,只能在当前文件访问
int main()
{
static int c;//这个是无链接性的变量,只能在main内访问
}

与普通变量不同的是,即使main函数没有运行,c也是在内存中的。

定义和引用声明

定义:定义给变量分配储存空间

引用声明:不给变量分配储存空间,因为他引用已经存在的变量 关键字extren,而且不可以进行初始化(原型还是可以初始化的,不过那样就叫定义了定义的时候加不加extern 无所谓)

但是在另一个文件使用这个变量则必须使用extern-----单定义规则

(如果不使用extern,则编译器将两个文件的同名变量看做相互独立的,都有各自的地址,当然,必须使用static关键字,否则会报错)

for(int i=0;i<10;i++)

{

static j=0;
int k=0;
k++;
j++;

}

在循环十次之后,static的值是10 k的值为1,因为j的值只会在开头的时候定义一次,在函数中每一次+1,k等于1是因为每次进去都会重新初始化置0

thread_local说明符

其他说明符只可以出现一个,这个说明符可以存在复数个,说明这个变量的持续性和线程一样。

volatile

这个说明符说明即使程序代码没有修改,他的值也可能发生变化,如硬件对串口数据的变化。

mutable

这个表示即使结构和类变量为const,但是其某个成员也可以被修改

const

对于const来说,使用const的变量被默认认为是已经使用了static,已经变成了内部链接或者无链接的。

但是这种默认的内部链接性可以通过前面加一个extern来取消,extern const int a;

函数的链接性

对于函数来说,他在整个程序运行的时候都存在,而且默认情况下,函数的链接性为外部的,也可以用static将其设置Wie内部性的,意味着这个函数只在文件中可见

语言链接性

C语言没有重载,所以C语言链接性可能将函数pill翻译为_pill

但是C++有重载,所以C++可能将函数翻译为_pill或者_p_i_ll

强制使用C语言链接性则 extern “C” void pill()

使用C++则不加或者使用extern “C++” void pill()

动态分配

new如何初始化

int *pi=new int (6);//可以将 * pi的值设置为6

初始化数组

int *ar=new int [4] {2,3,4,5}

初始化结构体

struct where{double x,double y,double z}

where * one=new where {2.5,3.5,4.5}

new其实有两个函数,一个叫new一个叫new []

int *pi =new int ;

等于 int *pi=new (sizeof(int))

int *pi=new int [40]

等于 int pi=new (40 * sizeof(int))

定位new

通常 new负责在堆区找到一个满足使用的内存块,new还有一种变体,允许你指定想要的位置

这个特性包含在new头文件中

char buffer[40];

使用方式int *pi=new (buffer) struct;

这样将这个结构体放到buffer中

命名空间

创建命名空间使用下面的语句namespace Name{

}

使用命名空间使用下面的语句 Name::pail=3;

使用using Name::pail 可以在当前区域中让pail等于Name::pail使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值