C++ 学习宝藏网站分享

C++ 学习宝藏网站分享

1. C++ 在线参考手册 Cppreference

https://zh.cppreference.com

C++ 开发者必备的在线参考手册,是我最常访问的 C++ 网站之一。作为参考手册,不仅包含了语言本身的词法、语法特性,还包含了对 C++ 标准库的介绍:需要 include 哪个头文件、接口参数/返回值说明、参考实现、示例代码、各家编译器的支持情况等。

参考手册就好像字典,对于大多数的开发人员来说,不需要从头看到尾。点开几个链接,看看里面有哪些内容,大致留个印象,具体用到了某个部分再来查阅即可。

如果一开始看起来有些吃力,就直接放弃了这个 C++ 宝藏网站,实在是太可惜了。可以先看下《C++ Primer》之类的书籍巩固下基础,然后再对照着 cppreference 手册一起看。

场景 1

现代 C++ 有一种说法:“如果你想提高代码质量,那就用 C++ 标准库算法替换所有的循环。换句话说,如果你还在写 for 循环遍历,说明你对 STL 的算法知之甚少” 。C++ 标准库中有上百种算法,很难记住所有的算法及其调用方式。但当你打算写一个遍历 for 循环的时候,不妨先去 cppreference 上看一眼,多数情况下你能找到更简洁清晰、质量更高、速度更快的标准库算法。

例如,计算一个 vector 内所有数据之和:

// 手写循环遍历,不好
auto sz = v.size();
for(size_t i=0; i<sz; ++i)
  sum += v[i];

使用标准库算法,代码简洁,意图清晰,表达力强:

// 好
auto sum = std::accumulate(std::begin(v), std::end(v), 0.0);

场景 2

不知道如何测量程序的执行时间,但是又不想使用从百度搜出来的,不知道经历了几手转载于 CSDN 上的,编码风格很烂、漏洞百出,甚至混杂着 C/C++98 的,勉强能跑,亦或不能跑的代码。想了解最新的现代 C++ 如何使用 chrono 库来计算程序执行耗时,想知道如何正确使用各种 clocktime_pointduration_cast,比起 CSDN 和百度,我更相信 cppreference。

抄作业,也要抄好学生的作业。

其他场景

如有类似下面的问题,cppreference 都可以快速给出准确、权威的解答。

  • 隐约记得 std::string 支持查找子串的方法,但记不清方法具体的使用参数、返回值,或者干脆不知道是否支持子串查找

  • std::vector 容器的 capacity()reserve() 的作用和用法

  • make_unique()make_shared() 哪一个是 C++11 引入的,哪一个是 C++14 引入的?

  • 项目只支持 C++14,能否使用 std::optional

2. C++ 核心指南(C++ Core Guidelines)

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

C++ Core Guidelines 是由 C++ 之父 Bjarne Stroustrup 和 C++ 标准委员会主席 Hurb Sutter 领导并维护的开源项目,旨在帮助 C++开发者更高效地使用现代 C++。C++核心指南侧重于接口、资源管理、内存管理、并发等影响程序架构设计的高级主题,遵循这些规则可以最大程度地保证类型安全,避免资源泄露及常见的错误,让你的代码更快、更好。

如果在做 Code Review 的时候,直接贴一个上一个 C++ Core Guidelines 的链接,会节省很多力气,也更有说服力。

吴咏炜老师曾说过:“学习 C++,主要就是学习 C++ Core Guidelines 和 C++ 惯用法”。巧了,我的我之前分享的很多篇随笔也都是围绕着这两个话题:

3. 谷歌 C++编码规范(Google C++ Style Guide)

https://google.github.io/styleguide/cppguide.html

不同于 C++ Core Guidelines 侧重 high-level 的规范,谷歌的这份 C++ Style Guide 包含了很多诸如格式、命名、注释、类、方法、头文件等相对 low-level 的详细编码规范,涉及开发过程的很多方面。每个条目都有优缺点的分析,以及最终的决定及理由。如果你的项目还没有一个编码规范,这是一份很好参考模板。

说句题外话:尽管使用 C++ 异常会带来很多好处,但 Google C++ 规范中不使用异常,因为 Google 现有的大量代码对异常的支持并不是很友好,全面转向异常需要花费大量的时间,且容易出现问题。但是正如规范中提到得那样,如果一切都是从头开始,可能会做出相反的决定。

4. Wandbox

https://wandbox.org

界面简洁的在线编译器。支持多种语言、多种编译器、同一编译器的不同版本,不需要本地搭建环境。

更多时候可能只是遇到拿不准的问题,想写几行代码快速验证一下,但手边没有编译环境,这时 Wandbox 就可以发挥作用了。

5. Compiler Explorer

https://godbolt.org

正如网站名字那样,编译器探索者。可以查看使用不同编译器、不同版本、不同编译选项编译产生的汇编代码,能够自动高亮关联到源码。然而这只是最基本的功能,更多强大的功能等着你自行探索。此外, Compiler Explorer 还提供丰富的模板,同时支持 vim 以及 VSCode 快捷键,也可以作为普通的在线 IDE 使用。

6. C++ Insights

https://cppinsights.io/

Compiler Explorer 的兄弟网站,能够显示 C++ 代码展开之后的样子。比如可以用它来探究直接初始化和拷贝初始化的区别(没区别),或者 range-for 是如何实现的:

7. Quick Bench

https://quick-bench.com/

顾名思义,这个网站是用来比较两个代码片段性能的。

注意,代码片段级优化只应该作为最后的优化手段!详见:性能优化的一般策略及方法 一文


汽车行业 C++ 程序员,持续学习,不定期分享,欢迎关注,共同进步!

posted @ 2024-01-13 22:50  Zijian/TENG  阅读(1912)  评论(0编辑  收藏  举报