第十二章 存储类别、链接和内存管理——《C Primer Pl

2023-02-21  本文已影响0人  One2INF

第十二章 存储类别、链接和内存管理

12.1 存储类别

对象(object):一块存储数据的内存,可以存储一个或多个值。

标识符(identifier):标识符是一个名称(变量名),用来指定对象的内容。遵循变的量命名规则。

可以认为对象是硬件层面,标识符是软件层面。

标识符不是唯一指定对象的途径。

int *pt = &entity;
int ranks[10];

*pt 不是标识符,但它指定了一个对象,即能够访问内存。

左值:指定对象的表达式。

可修改的左值:可以使用左值改变对象中的值的左值。

const char *pc = "Behold a string literal!";

pc 是可修改的左值;

*pc 是不可修改的左值。

12.1.1 作用域(scope)

描述程序中可访问标识符的区域。

12.1.2 链接(linkage)

标识符的多个翻译单元间的属性,是否跨翻译单元访问。

12.1.1 存储期(storage duration)

对象在内存中保留的时间。

5 中存储类别

存储类别 存储期 作用域 链接 声明方式
自动 自动 块内
寄存器 自动 块内,使用关键字 register
静态外部链接 静态 文件 外部 所有函数
静态内部链接 静态 文件 内部 所有函数外,使用关键字 static
静态无链接 静态 块内,使用关键字 static

不建议用 auto 关键字显示声明为自动变量。与 C++ 会有兼容性问题。

如果变量同名,内层块中的变量会隐藏外层块的定义。尽量避免同名,以免混淆。

静态的意思是其在内存中的位置不变,而非值不变。

寄存器变量:register 修饰,尽量变量存储在 CPU 寄存器中,取决于编译器。不能对其使用地址运算。

引用式声明(referencing declaration):extern 关键字修饰表明该声明不是定义,指示编译器去别处查询其定义。函数默认为外部函数。

12.2 随机函数和静态变量

简单实现了一个随机数种子生成函数和随机数产生函数,没什么好记的。

12.3 掷骰子

C 库函数 sand() 实现

12.4 分配内存:malloc() 和 free()

动态内存与静态内存的区别相当于一群人去饭店吃饭。

12.4 ANSI C 类型限定符

const:修饰常量不可变,注意修饰指针时就顶层 const 和底层 const 之分

volatile:告诉计算机该变量会在程序之外被修改,同时编译器不会优化含有该变量的相关代码,因为其随时会被修改。通常用于硬件地址以及在其他程序或同时运行的线程中共享数据。

restrict(C99):只能修饰指针,表明该指针时访问数据对象的唯一且初始的方式,允许编译器更好地优化代码。restrict 关键字有两个读者:

_Atomic(C11):并发程序设计中,当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象。

小知识

static 除了表明存储类别变量的作用域或链接外,还有新的用法:告诉编译器如何使用形式参数(C99) 。

double stick(double ar[static 20])

表示 ar 数组至少有 20 个元素,目的时让编译器使用这些信息优化函数代码。

上一篇 下一篇

猜你喜欢

热点阅读