在上一讲中,我介绍了几个用于编写高性能 C 代码的实用技巧。今天,我们继续聊这个话题,来讨论其他几种常见的 C 代码和程序优化技巧,它们分别是利用循环展开、使用条件传送指令、尾递归调用优化,以及为编译器指定更高的编译优化等级。 技巧五:循环展开(Loop Unrolling) 为了让你更好地理解“循环展开”这个优化技巧 […]

2022年11月19日 29点热度 Baimi 阅读全文

使用 C 语言正确实现的程序可以享受到最高的运行时性能。因此,如何编写具有“最高”执行性能的代码,是每个 C 程序员都在竭尽所能去探索的一个问题。那么,接下来的两讲,我们就来看看,如何编写高质量的 C 代码,来让我们的程序达到最佳的运行状态。 这一讲,我主要会为你介绍四个优化 C 代码的技巧,它们分别是利用高速缓存、利 […]

2022年11月18日 40点热度 Baimi 阅读全文

这一讲是这门课中关于 C 标准库的最后一讲。通过前面几讲的学习,相信你已经对 C 标准库提供的相关能力有了一个全面的认识。在此基础上,我们便可以使用这些成熟的接口,来更加方便地构建应用程序。这一讲后,在“ C 工程实战篇”的其他篇目中,我会和你一起讨论语言具体功能之外的性能优化、自动化测试、结构化编译等 C 工程化相关 […]

2022年11月17日 34点热度 Baimi 阅读全文

在前面的几讲中,我都以较大的篇幅介绍了 C 标准库中的一些重要概念,和相关接口的使用方式。除此之外,标准库中还有一些功能十分明确,使用方式也十分简单的常用接口,这些接口也为日常的 C 应用开发提供了重要支持。因此,在接下来的两讲中,我将围绕这部分内容展开介绍。 今天,我们先来看看标准库中与日期、时间以及实用函数有关的内 […]

2022年10月29日 58点热度 Baimi 阅读全文

相信你在第一次学习编程时,也写出过与下面这段类似的代码: #include <stdio.h> int main(void) { int x = 10; int y = 0; printf("%d", x / y); return 0; } 可以很明显地看到,这里在代码中,我们通过 printf 函数打印出 […]

2022年10月29日 50点热度 Baimi 阅读全文

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

2022年10月22日 60点热度 Baimi 阅读全文

在构建高性能应用时,并发编程是我们经常采用的一种技巧。它通过在程序的运行进程内提供可控制粒度更细的“线程”,从而将程序的整体功能拆分为更小的独立任务单元,并以此来进一步利用多核 CPU 的运算资源。 对于 C11 标准之前的 C 语言来说,想要构建多线程应用,只能依赖于所在平台上的专有接口,比如 Unix 与类 Uni […]

2022年10月18日 75点热度 Baimi 阅读全文

我曾在第 06 讲 中介绍过,C 语言中的函数调用是在 call 与 ret 两个指令的共同协作下完成的。这个过程包括程序执行流的转移、栈帧的创建、函数代码的执行、资源的清理,一直到函数调用完毕并返回至调用点的下一条指令上。总的来看,函数在正常情况下的调用流程是稳定有序的。 但实际上,这种以函数为单位的“顺序”执行流并 […]

2022年10月17日 65点热度 Baimi 阅读全文