第九章 内存模型和名称空间

9.1 单独编译

在同一个文件中只能将同一个头文件包含一次,有一种标准的 C++技术可以避免多次包含同一个头文件,它是基于预处理器编译指令#ifdef的,下面代码意味着仅当以前没有使用预处理器编译指令#define定义名称COORDIN_H时,才处理#ifndef和#endif之间的语句

#ifndef COORDIN_H_
#define COORDIN_H_
#endif

编译器首次遇到该文件时,名称COORDIN_H没有定义。在这种情况下,编译器将查看#ifndef和#endif之间的内容,并读取定义COORDIN_H_的一样,如果在同一个文件中遇到其他包含coordin.h的代码,编译器直到COORDIN_H_已经被定义了,从而跳到#endif后面的一行上,注意:该方法并不能防止编译器将文件包含两次,而知识让它忽略除第一次包含之外的所有内容

9.2 存储持续性,作用域和链接性【通常,编译器使用三块独立的内存,一块用于静态变量,一块用于自动变量,另外一块用于动态存储】

  • 自动存储持续性:在函数定义中声明的变量的存储持续性为自动的,它们在程序开始指向其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放
  • 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性为静态。它们在程序整个运行过程中都存在
  • 线程存储持续性:多核处理器很常见。这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中,如果变量是使用了关键字thread_local声明的,则其声明周期与所属线程一样长
  • 动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止

  • 管理变量的增减,之所以被称为栈,是由于新数据被象征性地放在了原有数据的上面,当程序使用完后,将其从栈中删除,栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。程序使用两个指针在跟踪栈,一个指针指向栈底–栈的开始位置,一个指针指向栈顶–下一个可用内存单元,但函数被调用时,其自动变量将被加入到栈中,栈顶指针指向变量后面的下一个可用内存单元,函数结束时,栈顶指针被充值为函数被调用前的值,从而释放新变量使用的内存

register

  • 关键字register,建议编译器使用CPU寄存器来存储自动变量,旨在提高访问变量的速度。在C++11中,这种提示作用也失去了,关键字register只是显示地指出变量是自动的

volatile

  • 关键字volatile表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化。该关键字的作用是为了改善编译器的优化能力,例如,编译器发现,程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个值两次,而是将这个值缓存在寄存器中,这种优化假设变量的值在这两次使用之间不会发生变化,如果不讲变量声明为volatile,则编译器将进行这种优化;将变量声明为volatile,不要进行这种优化

mutable

  • 可以用它来指出,即使结构变量为const,某个成员也可以被修改

9.3 名称空间

通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域,一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西,访问给定名称空间中的名称,通过作用域解析运算符::

using声明使一个名称可用,而using编译指令使所有的名称都可用。using编译指令由名称空间名和它前面的关键字using namesapce组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值