《C++ Primer Plus》读书笔记之七—内存模型和名称空间
第九章 内存模型和名称空间
1、不要将函数定义或者变量声明放到头文件中。
2、头文件常包含的内容:函数原型、使用#define或者const定义的常量、结构声明、类声明、模板声明、内联函数。
3、避免多次包含同一个头文件的技术:#ifndef/#endif。仅当以前没有使用预处理器编译指令#define定义一个头文件名称时,才处理#ifndef和#endif之间的语句。
4、链接性描述了名称如何在不同单元间共享。链接性为外部的名称可在文件间共享,链接性为内部的名称只能由一个文件中的函数共享。自动变量(函数定义中声明的变量(包括函数参数))的名称没有链接性,因为它们不能共享,作用域为局部。
5、常用的管理自动变量的方法是留出一段内存,并将其视为栈,以管理变量的增减。栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。程序使用两个指针来跟踪栈,一个指向栈底,另一个指向栈顶,即下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。新变量没有被删除,但不再被标记,它们所占用的空间被下一个将值加入到栈中的函数所使用。
6、C++支持使用register关键字来声明局部变量,说明该变量将被频繁使用。寄存器变量是另一种形式的自动变量。CPU访问寄存器中的值的速度比访问栈中的内存快。但编译器不一定会满足此声明。注:在寄存器中的变量没有内存地址,因此不能将地址操作符用于寄存器变量。
7、C++为静态存储持续性变量提供三种链接性:外部、内部和无链接性。这三种链接性都在整个程序执行期间存在,与自动变量相比,它们的寿命更长。编译器将分配固定的内存块来存储所有的静态变量,这些变量在整个程序执行期间一直存在。
8、链接性为外部的静态持续变量:必须在代码块的外面声明它,可以在程序的其他文件中使用它,即在其他文件中用extern对该变量进行引用声明,而且只有一个文件包含了该变量的外部定义;链接性为内部的静态持续变量:必须在代码块的外面声明它,并使用static限定符,表明该变量只能在其所属的文件中使用;无链接性静态持续变量:必须在代码块内声明它,并使用static限定符,这意味着虽然该变量只在该代码块中可用,但它在该代码块不处于活动时仍然存在。例子如下:
...
int global=1000; // 链接性为外部的静态变量
static int one_file=50; // 链接性为内部的静态变量
int main()
{
...
}
void fun1(int n)
{
static int count=0; // 无链接性静态持续变量
}
9、定义与全局变量同名的局部变量后,局部变量将隐藏全局变量。当将(::)放在变量名称前面时,该操作符表示使用变量的全局版本。
10、应使用链接性为外部的静态持续变量在多文件程序的不同部分之间共享数据;应使用链接性为内部的静态持续变量在同一个文件的多个函数之间共享数据。
11、如果初始化了 静态局部变量,则程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。
12、volatile关键字表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化。它的作用时为了改善编译器的优化能力。如果不将变量声明为volatile,则编译器将进行这种优化;将变量声明为volatile,相当于告诉编译器,不要进行这种优化。
13、mutable用来指出,即使结构(或类)变量为const,其某个成员也可以被修改。
14、默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的(就像使用了static说明符一样)。如果希望某个常量的链接性为外部的,则可以使用extern来覆盖默认的内部链接性。如:extern const int a=1;
15、C++不允许在一个函数中定义另外一个函数,因此所有函数的存储持续性都自动是静态的,即整个程序执行期间都一直存在。在默认情况下,函数的链接性为外部的,即可以在文件间共享。也可以用static将函数的链接性设置为内部的,使之只能在一个文件中使用,必须同时在原型和函数定义中使用该关键字。
16、对于非内联函数,程序中只能包含一个定义。
17、C语言链接性:在C语言中,一个名称只对应一个函数。C语言编译器可能将fun这样的函数名翻译为_fun。C++语言链接性:C++中,同一个名称可能对应多个函数,必须将这些函数翻译为不同的符号名称。
18、如果在C++程序中使用C库中预编译的函数,为了解决名字的匹配问题,可以用函数原型来指出要使用的命名约定:
extern “C” void fun(); // 使用C语言链接性
extern void fun(); // 使用C++语言链接性
extern “C++” void fun(); // 使用C++语言链接性
19、使用new来设置指针的语句必须位于函数中,这是因为只能使用常量表达式来初始化静态存储变量。
20、布局new操作符:指定要使用的位置。例子:
char buffer[500];
int *p;
p=new (buffer) int[20]; // 从buffer中分配空间给一个包含20个元素的int数组。
注:buffer指定的是静态内存,而delete只能用于这样的指针:指向常规new操作符分配的堆内存。也就是说,数组buffer位于delete的管辖区之外。所以不用delete来释放使用new操作符分配的内存。
21、声明区域:可以在其中进行声明的区域。潜在作用域:从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
22、名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。在默认情况下,在名称空间中声明的名称的链接性是外部的(除非它引用了常量)。
23、任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。
24、通过作用域解析操作符(::)来访问名称空间的名称。
25、using声明使特定的标识符可用,using编译指令使整个名称空间可用。
26、注:假设名称空间和声明区域定义了相同的名称。如果试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将名称空间的名称导入该声明区域,则局部版本将隐藏名称空间不版本。
27、一般来说,使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译指令导入所有名称,包括可能不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间的版本,而编译器并不会发出警告。
28、名称空间的其他特性:
①namespace A
{
namespace B
{
int a;
...
}
}
访问a的话:A::B::a。也可以使用using编译指令使内部的名称可用:using namespace A::B;②另外,也可以在名称空间中使用using编译指令和using声明:
namespace myth
{
using Jill::fetch;
using namespace element;
using std::cout;
using std::cin;
}
访问Jill::fetch,可以这样:std::cin>>myth::fetch;也可以这样:std::cout<<Jill::fetch;
using namespace myth;(添加了element名称空间)和using namespace myth;using namespace element;等价。
③可以给名称空间创建别名。namespace my_love{...}; namespace ml=my_love;
29、不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称,因此这种方法可以替代链接性为内部的静态变量。例如:
static int one_file; // 链接性为内部的静态变量
int main()
{
...
}
可以这样:
namespace
{
int one_file; // 链接性为内部的静态变量
}
int main()
{
...
}
30、在名称空间中声明的函数名的作用域为整个名称空间,因此定义和声明必须位于同一个名称空间中。
转载于:https://www.cnblogs.com/smile233/p/8796511.html
《C++ Primer Plus》读书笔记之七—内存模型和名称空间相关推荐
- static在内存层面的作用_「C++ Primer plus 心得」9.内存模型和名称空间
本章内容包括: 单独编译 存储持续性.作用域和链接性 定位new运算符 名称空间 C++ 为在内存中存储数据方面提供了多种选择.可以厅数据保留在内存中的时间长度(存储持续性)以及程序的哪一部分可以访问 ...
- C++ Primer Plus 第九章答案 内存模型和名称空间
9.5复习题 //1 homer将自动成为自动变量 在一个文件中将secret定义为外部变量,并在第二个文件中使用extern声明它 在外部定义前加上关键字static,将topsecret定义为一个 ...
- C++ Primer Plus学习(九)——内存模型和名称空间
内存模型和名称空间 单独编译 存储持续性.作用域和链接性 名称空间 单独编译 程序一般可以分为三部分: 头文件:包含结构声明和使用这些结构的函数的原型: 源代码文件:包含与结构有关的函数的代码: 源代 ...
- 2020 我的C++的学习之路 第九章 内存模型与名称空间
以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆. 内存模型与名称空间 存储持续性 作用域与链接 自动存储持续性 静态持续变量 静态持续性.外部链接性 静态持续性.内部链接性 静态 ...
- 【C++ Primer Plus】第9章 内存模型和名称空间
9.1 多文件程序 一个文件(头文件)包含了用户定义类型的定义:另一个文件包含操纵用户定义类型的函数的代码.这两个文件组成了一个软件包,可用于各种程序中. 头文件中常包含的内容: 函数原型. 使用#d ...
- C++(学习笔记)内存模型和名称空间
文章目录 前言 一.单独编译 二.存储持续性.作用域.链接性 1.作用域和链接 2.静态持续变量 3.静态持续性.外部链接性 4.静态持续性.内部链接性 5.静态持续性.无链接性 6.const全局变 ...
- 第9章 内存模型和名称空间
待定 本章内容: 单独编译 存储持续性.作用域和链接性 定位(placement)new运算符 名称空间 9.1 单独编译 9.2 存储持续性.作用域和链接性 9.2.4 静态持续性. ...
- 【C++】C++PrimerPlus(第6版)中文版 第9章 内存模型和名称空间 编程练习 参考答案
自己编写的参考答案,在VS2019中都可以编译通过,不是标准答案,也不是最优答案,仅供参考 1.下面是一个头文件 //golf.h – for pr9-1.cpp const int Len = 40 ...
- C++ primer plus读书笔记与心得
C++Primer plus读书笔记与心得 2020年过年期间,因新型冠状肺炎影响,推迟复工.根据公司读书计划,将c++ primer plus 这本书复习了一遍,并将其中一些章节中自己记忆模糊或者之 ...
最新文章
- 开启报名丨中文信息学会青工委学术沙龙:“推荐系统前沿进展”
- Springboot引用外部配置文件
- js全局变量和局部变量
- java 单例设计模式 [
- php随机获取文件夹,php从文件夹随机读取文件的方法
- Java集合—Deque Stack
- 打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh
- hashcode、equals
- Java网络编程:TCP实现聊天
- VC中CListCtrl设置滚动条在最下边的方法(MSDN中的例子)
- 《嵌入式Linux基础教程》补充阅读建议电子数目下载
- Objective-C GCD深入理解
- 微型计算机三级项目,微机原理三级项目.doc
- (JS基础)操作表单
- Java我的世界forge安装失败,我的世界forge安装失败install怎么办
- ckplayer超酷网页播放器
- RK平台HDMI、喇叭音频同时输出
- OneNote如何同步到OneDrive,并且如何在PC和手机上完美使用OneNote
- AppEmit是应用程序(尤其是浏览器)与本地程序间互相通信的易扩展的轻量级中间件
- Python爬虫实战,QQ音乐爬取全部歌曲
热门文章
- 优雅的嵌套滑动解决方式-NestedScroll
- 几何画板200个经典课件_2020国学起名:7部国学经典,200个大气独特的好名字
- 将python程序打包成可执行文件exe
- python函数的组成要素_写好一个Python函数的六要素
- gdbstub中的基本命令_程序员应该知道的 20 个 Linux 系统管理命令
- -bash: ifconfig: 未找到命令
- Java中Comparable接口与Comparator接口
- 在arm上运行x86动态库_苹果官宣:Arm取代英特尔
- android 动态改变语言,android动态设置app当前运行语言的方法
- 线程演示生产者和消费者的一个例子