【送书】帮你成为 C/C++ 技术栈的熟练工

博文小编

2021-09-07

在大多数同学眼里,C/C++ 是一门非常“难学”的编程语言,然而一旦学生,其功无穷。那要如何学习呢?

C/C++ 这门语言与其他高级语言不同,它是离操作系统较近的语言。所以学好 C/C++ 体系的技术栈必须结合操作系统的运行机制来学习。

展开来说,就是你必须掌握操作系统层面的几大基础知识,他们是汇编、编译链接与运行时体系、狭义的操作系统原理、多线程、网络编程。

第一个基础知识是汇编,我们学习汇编不是一定要用汇编来写代码,就像我们学习 C/C++ 也不一定单纯为了面试和找工作。

对于 C/C++ 的同学来说,汇编是建议一定要掌握的,只有这样,你才能在书写 C++ 代码的时候,清楚地知道你的每一行C++代码背后对应着什么样的机器指令,if/for/while 等基本程序结构如何实现的,函数的返回值如何返回的,为什么整型变量的数学运算不是原子的,最终你知道如何书写代码才能做到效率最高。

掌握了汇编,你可以明白,在 C++ 中,一个栈对象从构造到析构,其整个生命周期里,开发者的代码、编译器和操作系统分别做了什么。掌握了汇编,你可以理解函数调用是如何实现的,你可以理解函数的几种调用方法,为什么printf这样的函数其调用方式不能是stdcall,而必须是cdecl。掌握了汇编,你就能明白为什么一个类对象增加一个方法不会增加其实际占的内存空间。

第二个基础知识是编译、链接与运行时体系知识。作为一个开发者,要清楚地知道我们写的 C/C++ 程序是如何通过预处理、编译与链接等步骤最终变成可执行的二进制文件,操作系统如何识别一个文件为可执行文件,一个可执行文件包含什么内容,执行时如何加载到进程的地址空间,程序的每一个变量和数据位于进程地址空间的什么位置,如何引用到。

一个进程的地址空间有些什么内容,各段地址分布着什么内容,为什么读写空指针或者野指针会有内存问题。一个进程如何装在各个 so 或 dll 文件的,这些文件被加载到进程地址空间的什么位置,如何被执行,数据如何被交换。

第三个基础知识是狭义的操作系统原理。这里加上“狭义”二字是因为从广义上来讲,以上所说的内容都是操作系统原理的范畴。狭义的操作系统原理这里包括操作系统如何管理进程与线程,虚拟内存与物理内存之间的对应关系,何为内存映射文件,进程之间如何通信等等。

第四个基础知识是多线程知识。严格来说,这点已经包括在第三点之中了,我之所以将其单独列出来,是因为多线程编程是我们做应用服务最常用的技术之一。最近面试过几个学历非常好的同学,对于一个进程中如果某个线程因为内存问题而退出,是否会导致整个进程退出的问题答不好,实在不应该。多线程知识其实不难学,立足于理解与实践而不是应付面试,可以学的很好。

无论是 Windows 还是 Linux 操作系统,操作系统提供的线程同步对象就那么几种,Windows 常用的有临界区(关键端)、Event、互斥体、信号量等,Linux 有互斥体、信号量、读写锁、条件变量,这些知识点学过则会,不学则不会。这些线程同步原语花上几天就能搞得清楚,大多数同学不是学不会,而是不愿意学,但是偏偏喜欢在简历上写上自己熟悉多线程编程。

面试的时候,被问到条件变量的虚假唤醒机制都说不清楚,非要说自己用过条件变量。这是一些同学犯的很低级的错误,如果真用过条件变量,如果不知道虚假唤醒机制,那一定写的代码是不对的。市场上目前没有任何一本图书对以上知识形成体系的介绍,当然,我的本书填补了这一空缺,你将从本书中获得从进程与线程的关系,再到常用的线程同步原语的区别与使用场景,再到线程池以及基于生产者消费者模型的消息队列,以及对协程思想介绍的相关知识。

掌握了常见的多线程同步原语之后,接下来可以找一些带多线程的项目去学习一下,不管是否带 UI 的都行。我推荐的一种方式是,使用 gdb 或者 Visual Studio 调试器将你需要学习的多线程程序中断下来,在多线程面板,看看这个进程一共有多少个正在运行的线程,分析每个线程的作用,然后研究下这些线程在何时何地创建的,为什么需要创建新的线程。尝试爱过几个人,面对爱情你会诚实很多;尝试研究几个多线程项目,面对多线程你会熟练许多。

第五个是网络编程,直白地说就是 Socket 编程。操作系统层面提供的 API 会在相当长的时间内保持接口不变,一旦学成,终生受用。理解和掌握常用的基础 socket API 不仅可以最大化地去定制各种网络通信框架,更不用说使用市面上流行的网络通信库了,最重要的是,它会是你排查各种网络疑难杂症坚实的技术保障。操作系统层面提供的网络模型就那么几种,无论像 Java/Go/Python 等语言如何封装,作为技术的源头,我们有什么理由不去掌握它呢?

以上是基于 C++ 技术栈来说,并没有包括算法与数据结构、数据库等方面的基本功,但是这些额外的也是应该需要掌握的。掌握了如上所说的,你就达到了一个熟练工阶段

为了帮助大家学好 C++,给大家推荐一本书《C++ 服务器开发精髓》

市面上关于网络编程的书很多,书中结合作者这些年的工作经验总结了二十几个网络编程中的重点和难点,现在全部交给你。

我们联合了5个号主,给大家送 10 本此书,每个号主抽奖送 2 本,一共 10 本。各个号主单独抽奖,5个一起参加,中奖几率更大。


《C++ 服务器开发精髓》这本书正是一本帮你成为 C/C++ 技术栈的熟练工的书。当然,这本书除了详细讲解了 C++11/14/17 新标准常用的方法以外,只是以 C/C++ 为编程语言来介绍相关的后端开发技术栈,这不是一本讲 C/C++ 语言本身的书,讲 C/C++ 语言的书太多了,多如过江之鲫。

这本书有什么内容?

这本书中详细地介绍了除了数据库以外、要掌握成为一名合格的 C++ 开发者需要掌握哪些知识。通过本书你将获得:

C++ 开发编译调试完整技术链;
C++ 11/14/17 常用特性和实用方法
多线程编程技术;
作者精心凝炼的二十多个网络编程重难点知识;
网络故障排查与定位知识;如何设计可兼容可扩展的通信协议;
如何设计高性能网络框架;
如何设计高性能服务框架;
如何开发服务常用组件等。

图书作者是一线开发,所以书中的内容全部是实战经验,作者喜欢追求能落地的技术,所以全书虽然很厚,但是每一章节的内容都是实实在在地剖析技术背后的原理,教你知其然更知其所以然。

这本书适合哪些读者?

如果你是个学生,将来想做 C/C++ 后台开发,或者你做了几年 C/C++ 后台开发后,还没形成自己的技术体系或者技术认知,强烈推荐这本书,除了数据库部分没用,其他部分都介绍的很详细。本书最大的特点就是用了非常细粒度的示例,娓娓道来,解释清楚各个技术原理,详述哪些是重点和难点,且这些示例都来自实际开发。

如果你是非 C/C++ 技术栈的读者,想了解自己所用的语言(如 Java/Go )的运行时在操作系统接口层面是如何实现的,那么这本书也适合你。

现在还可以在哪里买到?

图书采用大开本印刷,一共七百多页,厚度比肩《算法导论》。

原价168,本号粉丝福利,五折专享

快快扫码抢购吧!

读者评论

相关博文

  • 校招 C++ 大概学习到什么程度?

    校招 C++ 大概学习到什么程度?

    博文小编 2021-11-15

    一图胜千言,成为熟练工。 C/C++ 这门语言与其他高级语言不同,它是离操作系统较近的语言。所以学好 C/C++ 体系的技术栈必须结合操作系统的运行机制来学习。展开来说,就是你必须掌握操作系统层面的几大基础知识,他们是汇编、编译链...

    博文小编 2021-11-15
    168 0 0 0
  • 一文搞懂网络库的分层设计!

    一文搞懂网络库的分层设计!

    博文小编 2021-06-26

    想了解更多关于C++服务器开发的内容,推荐阅读《C++服务器开发精髓》一书! 《C++服务器开发精髓》 张远龙 著 从操作系统原理角度讲解C++服务器开发技术栈 内容详尽细致、版本新 重磅级C++服务器开发红宝书 ...

    博文小编 2021-06-26
    305 0 1 0