深入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语言和程序运行原理(15)如何使用互斥量等技术协调线程运行?

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

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

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

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

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

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

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

深入c语言和程序运行原理(11)字符、字符串处理与数学计算

在前面的 10 节课中,我主要围绕着 C 语言的七大关键语法,介绍了它们在机器指令层面的实现细节。而接下来,走出语法,从微观到宏观,我们将开始进一步探索 C 语法之外,那些可以用来支撑大型 C 项目构建的特性和技术。 因此,在这一模块中,我会介绍和 C 语言标准库、工程化,以及性能优化等相关的内容。C 标准库是除 C 基本核心语法外,C 语言的另一个重要组成部分。C 标准库中提供了众多的类型、函数
深入c语言和程序运行原理(11)字符、字符串处理与数学计算

深入c语言和程序运行原理(10)预处理器是怎样处理程序代码的?

C 预处理器是 C 标准中的另一块重要内容。对代码进行预处理,是 C 源代码在被“真正”编译,并生成机器代码前的重要一环。合理使用预处理指令,可以让源代码根据不同的环境信息进行动态变化,并生成适合在当前环境下编译的 C 代码。这里我们提到的“环境”,一般与目标操作系统、CPU 体系架构,以及当前平台上各系统库的支持情况有关。 除此之外,预处理器还为我们提供了一定的能力,可以更加高效、灵活地组织 C
深入c语言和程序运行原理(10)预处理器是怎样处理程序代码的?

深入c语言和程序运行原理(9)指针是如何灵活使用内存的?

“指针”是 C 语言为我们提供的最为强大的武器之一。借助指针,我们可以更加灵活地使用应用程序所享有的内存。 不同于 Python、Java 等语言,C 语言为我们提供了这样一种能力:可以让程序员根据需要,主动选择使用“按值传递”或“按指针传递”这两种不同的数据引用方式。通常,按值传递会涉及原始数据的复制过程,因此在某些情况下,可能会引入额外的性能开销。而按指针传递则使程序内存中的“数据共享”成为了
深入c语言和程序运行原理(9)指针是如何灵活使用内存的?