深入c语言和程序运行原理(12)深入理解标准 IO

输入输出(简称 “IO”)是应用程序不可或缺的一种基本能力。为了保持设计上的精简,C 语言并没有在核心语言层面提供对 IO 相关接口的支持,相反,采用了标准库的方式来实现。通过引用名为 stdio.h 的标准库头文件,我们便可以快捷地为 C 程序添加读取用户键盘输入、输出内容到控制台,乃至读写文件等一系列常规的 IO 功能。 这一讲,我将为你深入介绍 C 语言中的标准 IO 模型,以及它背后的一些
深入c语言和程序运行原理(12)深入理解标准 IO

深入c语言和程序运行原理(13)非本地跳转与可变参数是怎样实现的?

我曾在第 06 讲 中介绍过,C 语言中的函数调用是在 call 与 ret 两个指令的共同协作下完成的。这个过程包括程序执行流的转移、栈帧的创建、函数代码的执行、资源的清理,一直到函数调用完毕并返回至调用点的下一条指令上。总的来看,函数在正常情况下的调用流程是稳定有序的。 但实际上,这种以函数为单位的“顺序”执行流并不能完全满足 C 语言在使用时的所有应用场景。因此,C 标准从 C90 开始,便
深入c语言和程序运行原理(13)非本地跳转与可变参数是怎样实现的?

深入c语言和程序运行原理(14)C 并发编程基础知识

在构建高性能应用时,并发编程是我们经常采用的一种技巧。它通过在程序的运行进程内提供可控制粒度更细的“线程”,从而将程序的整体功能拆分为更小的独立任务单元,并以此来进一步利用多核 CPU 的运算资源。 对于 C11 标准之前的 C 语言来说,想要构建多线程应用,只能依赖于所在平台上的专有接口,比如 Unix 与类 Unix 平台上广泛使用的 POSIX 模型,以及后起之秀 OpenMP 模型等。这些
深入c语言和程序运行原理(14)C 并发编程基础知识

深入c语言和程序运行原理(15)如何使用互斥量等技术协调线程运行?

在上一讲中,主要介绍了有关并发编程的一些基础知识,并通过一个简单的例子展示了如何在 C 语言中进行线程创建等基本操作。同时我也向你介绍了,数据竞争、竞态条件,以及指令重排等因素,都在如何影响着多线程应用的执行正确性。那么,有哪些方法可以辅助我们解决这些问题呢? 今天我们就来看看 C 语言为并发编程提供的几大利器:互斥量、原子操作、条件变量,以及线程本地变量。 使用互斥量 从本质上来看,互斥量(Mu
深入c语言和程序运行原理(15)如何使用互斥量等技术协调线程运行?

深入c语言和程序运行原理(16)信号与操作系统软中断有什么关系?

相信你在第一次学习编程时,也写出过与下面这段类似的代码: #include <stdio.h> int main(void) { int x = 10; int y = 0; printf("%d", x / y); return 0; } 可以很明显地看到,这里在代码中,我们通过 printf 函数打印出了除法表达式 x / y 的计算结果。但定睛一看,你就会发现:在这个表达式中,除
深入c语言和程序运行原理(16)信号与操作系统软中断有什么关系?

深入c语言和程序运行原理(17)日期、时间与实用函数

在前面的几讲中,我都以较大的篇幅介绍了 C 标准库中的一些重要概念,和相关接口的使用方式。除此之外,标准库中还有一些功能十分明确,使用方式也十分简单的常用接口,这些接口也为日常的 C 应用开发提供了重要支持。因此,在接下来的两讲中,我将围绕这部分内容展开介绍。 今天,我们先来看看标准库中与日期、时间以及实用函数有关的内容。其中,日期与时间的相关接口由头文件 time.h 提供;而实用函数的功能则可
深入c语言和程序运行原理(17)日期、时间与实用函数

深入c语言和程序运行原理(18)标准库:断言、错误处理与对齐

这一讲是这门课中关于 C 标准库的最后一讲。通过前面几讲的学习,相信你已经对 C 标准库提供的相关能力有了一个全面的认识。在此基础上,我们便可以使用这些成熟的接口,来更加方便地构建应用程序。这一讲后,在“ C 工程实战篇”的其他篇目中,我会和你一起讨论语言具体功能之外的性能优化、自动化测试、结构化编译等 C 工程化相关内容,并带你手把手实现一个简单的高性能 HTTP Server。 今天,我们来看
深入c语言和程序运行原理(18)标准库:断言、错误处理与对齐

深入c语言和程序运行原理(19)极致优化(上):如何实现高性能的 C 程序?

  使用 C 语言正确实现的程序可以享受到最高的运行时性能。因此,如何编写具有“最高”执行性能的代码,是每个 C 程序员都在竭尽所能去探索的一个问题。那么,接下来的两讲,我们就来看看,如何编写高质量的 C 代码,来让我们的程序达到最佳的运行状态。 这一讲,我主要会为你介绍四个优化 C 代码的技巧,它们分别是利用高速缓存、利用代码内联、利用 restrict 关键字,以及消除不必要内存引用
深入c语言和程序运行原理(19)极致优化(上):如何实现高性能的 C 程序?