第十二章 存储类别、链接和内存管理——《C Primer Plus》笔记

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

12.1 存储类别

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

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

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

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

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

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

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

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

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

pc 是可修改的左值;

*pc 是不可修改的左值。

12.1.1 作用域(scope)

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

  • 块作用域(block scope):块是用一对花括号括起来的代码区域,定义在块内的变量具有块作用域,块作用域变量的可见范围是从定义处到包含带定义的块的末尾。另外,虽然函数的形式参数在函数的左花括号之前,但是它们也具有块作用域,属于函数体这个块。类似的还有 for while 循环、do while 循环和 if 语句。
  • 函数作用域(function scope):整个函数,仅用于 goto 语句的标签。即使一个标签的首次出现在函数的内层块中,它的作用域也延伸至整个函数。
  • 函数原型作用域(function prototype scope):从形参定义到原型声明结束,用于函数原型的形参名,但是函数原型的形参名通常无关紧要。
  • 文件作用域(file scope):从变量定义到定义所在文件的末尾,文件作用域变量亦称全局变量。

12.1.2 链接(linkage)

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

  • 外部链接:文件作用域的非 static 变量。
  • 内连接:文件作用域的 static 变量。
  • 无连接:具有块作用域、函数作用域或函数原型作用域的变量都是无连接变量。意味着这些变量属于定义它们的块、函数或原型私有。

12.1.1 存储期(storage duration)

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

  • 静态存储期:程序执行阶段一直存在。文件作用域变量,static 变量。
  • 线程存储期:从声明到线程结束一直存在。并发程序设计时考虑。
  • 自动存储期:程序运行到作用域内到出该变量的作用域结束。除 static 变量的块作用域变量。变长数组不同,它们的存储周期从声明到出该变量的作用域结束。
  • 动态分配存储期:mallocfree 结束。

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 关键字有两个读者:

  • 一个是编译器,告知编译器可以自由假定一些优化方案;
  • 另一个是用户,告知用户要使用满足 restrict 要求的参数。

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

小知识

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

double stick(double ar[static 20])

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容