【c++ primer】第九章读书笔记

来源:互联网 发布:大连 谭作钧 人工智能 编辑:程序博客网 时间:2024/05/21 18:18
第九章   内存模型和名称空间
1.单独编译
C++使用include来使程序包含多个文件,与其将声明放在每个文件中,不如放在头文件中,这样,当我们使用某些函数或者结构时,我们可以直接使用include包含某个头文件。
一个文件(头文件)包含了用户定义的类型的定义,另一个文件包含操作用户定义类型的函数的代码。
不要在头文件中定义函数或者声明变量,因为当一个文件去调用它时是正确的,函数或者变量就被定义了一次,但是第二个文件去调用它就有可能出错,因为文件再次定义了一次函数或者变量。

函数头文件中常包含的内容:
1.函数原型
2.使用#define或const定义的符号常量
3.结构声明
4.类声明
5.模板声明
6.内联函数
个人觉得全局变量也可以放进去。
结构变量是可以放进去的,它的定义并不产生变量,只有定义具有该结构的变量时才会创建该变量。


2.存储持续性、作用域和链接性
首先了解C++使用4种不同的方式来存储数据,这些方法的区别就在于数据保留在内中的时间。
1.自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行它们所在的函数或代码块的时候被创建,在执行完函数或代码块时,它们所占的内存被自动释放。C++有两种存储持续性为自动的变量。
2.静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都都为静态。它们在程序整个过程中都存在。C++有三种存储持续性为静态的变量。
3.线程存储持续性C++11:多核处理器很常见,这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程一样长。不讨论并行编程。
4.动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时被称为自由存储(free store)或堆(heap)。

2.1作用域和链接性
作用域(scope)描述了名称在文件(翻译单元)的多大范围内可见。
链接性(linkage)描述了名称如何在不同单元(文件?)间共享。链接性为外部的名称可在文件间共享。链接性为内部的名称只能由一个文件中的函数共享。自动变量的名称没有链接性,因为它们不能共享。
作用域为局部的变量只能在定义它的代码块中可用(代码块指由花括号括起来的一系列语句)。作用域为全局的的变量在定义的位置到文件结尾之间都可用。
自动变量的作用域为局部,静态变量的作用域是全局还是局部取决于它是如何被定义的。在函数中声明的参数作用域为函数体,在类中声明的成员作用域为整个类。在名称空间?中声明的变量的作用域为整个名称空间。(全局是名称空间的一个特例)
静态变量存在于程序运行的全过程中,如果没有被初始化,默认为0.
创建链接性为外部的静态变量,必须在代码块的外部声明它;要创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;要创建没有链接性的静态持续变量,必须在代码块内部声明它,并使用static限定符。
...
int global=1000;//static duration,external linkage
static int one_file =50;//static duration,external linkage
int main()
{
...
}
void funct1(int n)
{
    static int count=0;//static duration,no linkage
    int llama=0;
...
}
void funct2(int q)
{
...
}

1.单定义规则

变量只能有一次定义,所以在定义过后只能使用引用,来声明变量。
引用声明使用关键字extern,且不进行初始化。

2.7说明符和限定符
主要说限定符volatile ,定义这种限定符意义在于阻止编译器进行优化。例子:编译器发现,程序在几条语句中都调用了一个变量,那么编译器可能会把这个变量放到寄存器中,这种优化是假设变量值不变的情况下。将变量声明成volatile,就是告诉编译器不要这样

mutable
这个声明使得变量或者结构为const,其中某个成员也可以被修改
struct data
{
char name[30];
mutable int accesses;
};
const data veep={"ssss",0};
veep.accesses++;//被mutable的值可以被修改

函数链接性
默认函数的链接性是外部的,即外部文件可以使用extern关键字来声明它。也可以是内部的,用static声明和定义它。(局部函数无意义)。
另外,编译器优先搜索自己写的文件,如果发现相应的函数则调用,如果有两个则报错,没有的话,再搜索链接的库函数。

存储方案和动态分配
new和delete

动态分配不是由作用域和链接性规则来控制的,因此,可以再一个函数中分配动态内存,而在另一个函数中将其释放。通常,编译器使用三块独立的内存:一块用于静态变量(可能再细分),一块用于自动变量,一块用于动态存储。

定位new运算符。

用于精细管理内存。


9.3名称空间

using namespace std;


0 0
原创粉丝点击