现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
3995 人已学习
课程目录
已更新 33 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (11讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
13 | 编译期能做些什么?一个完整的计算世界
14 | SFINAE:不是错误的替换失败是怎么回事?
15 | constexpr:一个常态的世界
16 | 函数对象和lambda:进入函数式编程
17 | 函数式编程:一种越来越流行的编程范式
18 | 应用可变模板和tuple的编译期技巧
19 | thread和future:领略异步中的未来
20 | 内存模型和atomic:理解并发的复杂性
实战篇 (7讲)
21 | 工具漫谈:编译、格式化、代码检查、排错各显身手
22 | 处理数据类型变化和错误:optional、variant、expected和Herbception
23 | 数字计算:介绍线性代数和数值计算库
24 | Boost:你需要的“瑞士军刀”
25 | 两个单元测试库:C++里如何进行单元测试?
26 | Easylogging++和spdlog:两个好用的日志库
27 | C++ REST SDK:使用现代C++开发网络应用
新年特别策划 (2讲)
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
新春福利 | C++好书荐读
未来篇 (2讲)
28 | Concepts:如何对模板进行约束?
29 | Ranges:无迭代器的迭代和更方便的组合
现代C++实战30讲
登录|注册

21 | 工具漫谈:编译、格式化、代码检查、排错各显身手

吴咏炜 2020-01-13
你好,我是吴咏炜。
现代 C++ 语言,我们讲到这里就告一段落了。今天我们正式开启了实战篇,先讲一个轻松些的话题——工具。

编译器

当然,轻松不等于不重要。毕竟,工欲善其事,必先利其器。我们做 C++ 开发,最基本的工具就是编译器,对其有些了解显然也是必要的。我们就先来看看我在专栏开头就提到的三种编译器,MSVC [1]、GCC [2] 和 Clang [3]

MSVC

三种编译器里最老资格的就是 MSVC 了。据微软员工在 2015 年的一篇博客,在 MSVC 的代码里还能找到 1982 年写下的注释 [4]。这意味着 MSVC 是最历史悠久、最成熟,但也是最有历史包袱的编译器。
微软的编译器在传统代码的优化方面做得一直不错,但对模板的支持则是它的软肋,在 Visual Studio 2015 之前尤其不行——之前模板问题数量巨大,之后就好多了。而 2018 年 11 月 MSVC 宣布终于能够编译 range-v3 库,也成了一件值得庆贺的事 [5]。当然,这件事情是值得高兴的,但考虑我在 2016 年的演讲里就已经用到了 range-v3,不能不觉得还是有点晚了。此外,我已经提过,微软对代码的“容忍度”一直有点太高(缺省情况下,不使用 /Za 选项),能接受 C++ 标准认为非法的代码,这至少对写跨平台的代码而言,绝不是一件好事。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • Geek_71d4ac
    想知道在vim上写C++,有没有比较好的插件推荐,谢谢

    作者回复: 看我的 Vim 配置,我用到的这些和 C++ 开发有关:

    clang_complete
    nerdcommenter(注释)
    vim-fugitive(git)
    vim-gitgutter(git)
    code_complete
    echofunc

    另外,我在 .vimrc 里加了下面几句来集成 clang-format:

    " Key mappings to use clang-format
    noremap <silent> <Tab> :pyxf /usr/local/opt/llvm/share/clang/clang-format.py<CR>
    inoremap <silent> <C-F> <ESC>:pyxf /usr/local/opt/llvm/share/clang/clang-format.py<CR>i

    2020-01-13
    5
  • tech2ipo
    我看到公司的算法库都用intel的icc编译器编译的,算法的同事说icc编译器编译的代码性能会好一些,对于计算密集型的程序是否可以用icc编译器代替gcc?

    作者回复: 你可以对照下面链接看一下,你需要的 C++ 功能在 ICC 里是不是支持了:

    https://en.cppreference.com/w/cpp/compiler_support

    初看之下,似乎问题不大。但性能问题,还是需要实测的。

    如果发现有问题(性能或功能),混合编译器也是可以考虑的,虽然管理上会复杂点。可以考虑把需要 ICC 编译的东西放单独的项目,编译成库,供其他项目使用。

    2020-02-02
    1
  • 王小白白白
    老师,c++项目用clang编译耗时10min,gcc 20min,在使用gcc的前提下有什么办法提高速度呢,最近研究使用预编译头,并且拆分头文件,快了三四分钟感觉也不理想。另外clang和gcc编译速度为什么差这么多呀

    作者回复: clang 本来就是为这方面做了很多优化的……但产生优化的二进制文件,似乎 gcc 仍然要强些。

    可以考虑并发编译。首先是 make 本身的 -j 参数。其次网上你能找到工具做多机并发编译的。

    2020-02-03
  • 睡在床板下
    windbg + application verifier + pclint
    2020-01-17
  • 阿太
    老师,在vscode用了您的clangformat配置,为啥好多配置选项报错呢。比如 regx 这些选项

    作者回复: 具体什么错误?在命令行上直接运行有问题吗?

    这些选项我从 Clang 3.x 开始用的,现在是 Clang 9,不应该有兼容性问题的……

    2020-01-14
  • 花晨少年
    一直在ubuntu用clion+bazle进行项目编译,感觉挺好用的,但是macbook这套方案没法用,很蛋疼。

    作者回复: Bazel?那你只能找Bazel和JetBrains的人解决这个兼容性问题了,我可没办法。😅

    或者改用CMake?我看了下Bazel的介绍,没觉得它比CMake好。特别是,CMake有不少特别的对C++的支持,包括对不同的编译器、Boost的库链接选项、C++标准,等等。

    2020-01-13
    1
  • 三味
    cpp中第三方库的管理超麻烦,x86或x64,release或debug,从vc6到最新的vs2019,windows下第三方库管理起来太麻烦了。
    那么,有没有一种好用的第三方库管理呢?
    如果用vs2015以上,超推荐使用vcpkg啊!就连生成汇编参考的那个网页工具,都大大咧咧的横幅推荐vcpkg,好用到爆啊!
    如何使用不多说了,如何好用提一下。命令行安装对应的库,工具会进行漫长的编译。要引用这个库,只需要#include对应的头文件,lib库会自动加载,dll会在运行的时候拷贝。就这样。

    作者回复: 名气是挺响了。我没有使用经验……

    2020-01-13
  • 廖熊猫
    看到C++ Insights这个工具了,跟大家分享一下这段总结的关于递归模板的几个心得吧。
    根据老师讲的这几种,我把这几种分类成: 1.数值、2.拉取、3.打包。
    1. 数值型:操作数值(一般是减去),然后到达一个终止条件(一般是等于0),例如factorial
    2. 拉取型:从...中每次拉取一个数值跟第一个参数进行操作,合并成一个参数,继续拉取过程,直到后面...中的参数被用光,终止条件就是指剩一个参数,例如: sum
    3. 打包型: 从第一个参数中分离出一个参数进入...参数包中,然后继续这个过程,直到第一个参数达到终止条件,例如: make_index_sequence
    只是个人见解,希望能对大家有点帮助。

    作者回复: 挺好。这确实是最常见的几种用法。

    2020-01-13
  • tt
    文末有彩蛋呦——C++ Insights

    作者回复: 嗯,这个是最近发现的,赶忙补进工具篇。

    2020-01-13
  • tt
    嗯,我说老师的代码怎么是我订阅的课程里显示最友好的呢!👍

    作者回复: 工具很重要。😎

    2020-01-13
收起评论
10
返回
顶部