C++进阶引导
1.C++的用途和意义

总体来说,C++作为一门软件开发语言,它的流行度是在减少的。主要原因在于语言的复杂和灵活导致软件开发成本提高,这体现在开发周期和人力上。它不适用于startup公司的快速开发,也不适合用于普通的对性能要求不高的软件系统中。C++的优势体现在语言的灵活和对底层的控制,比如内存分配和释放,和其他硬件的交互能力上,这导致在对性能要求高的系统中它能够体现价值,在金融业常用于两类系统,衍生品定价系统(包括风险控制的计算系统),以及低延迟交易系统。这也是为什么金融行业对Quant常常要求C++的原因。因为C++用途的局限,一般建议程序员应多学一些其他语言,如Python, JavaScript, R, Java, Scala等。
- C++入门
C++入门最推荐的书是C++ Primer (注意,不是C++ Primer Plus) ,或者The C++ Programming Language,二者选一即可。读之前最好已经有一点编程的基础,不管什么语言。这些书内容很多,应该侧重于理解概念,而非单纯记忆。重要的概念理解后自然会记住,一些不是很重要的概念一时记不住也没有关系。C++的概念和规则很多,就算是有经验的C++程序员有时也需要google一些语言规则。在这个阶段应该掌握重要的概念。
这一阶段以后可以思考下面这些问题。
Difference between pointer and reference?
i++, ++i, which one is better?
Why use virtual destructor?
What is the signature of a copy constructor/ assignment operator?
How to specialize a class template?
What are the four types of casts in C++? Usage?
etc.
- 算法和数据结构
对C++来说,首先要了解Standard Template Library中提供的数据结构的复杂度以及常见的实现。了解各种算法,可以参考算法导论CLRS前17章,Cracking coding interview等书,这些书所采用的语言并不重要,主要是了解算法。Leetcode的easy和median难度的题目可以用来练习。可以思考的问题有:
What does reserve() do on std::vector? What is the complexity of adding element to a std::vector?
Underlying data structure of std::map/std::unordered_map? Implementation outline.
K-way merge sort.
How would you implement atoi and itoa functions?
Max sum subarray problem.
How to compute max drawdown of a price time series?
- C++进阶
可以阅读Effective C++, Effective STL, C++ FAQ(website) 和一定编程规模(数千行代码量)的project。只有在Project中才能真正学习。C++ standard library 的实现也是很好的学习工具。它有几个不同的实现,GCC, SGI, Clang等。Clang的实现比较清晰,如果用GCC作为编译器的话了解GCC的实现对有效使用library中的container是很有好处的。对于Quant来说不一定要掌握到这个部分所提到的内容,有兴趣的话可以学习。
这个阶段以后可以思考下面这些问题。
What is strong exception guarantee? Cost of exception handling? Why C++11 deprecate exception specification?
What is type trait?
What is smart pointer? Difference between std::shared_ptr<T> and boost::instrusive_ptr<T>? Implementation outline.
How is virtual function call implemented? What is the cost of virtual function calls? What is CRTP? What is the limitation of that?
What is the runtime cost of a lambda function? What is the cost of std::function compare to a function pointer? *What does std::function gain from that cost?
注1:带*号为难度较大的问题,Quant或初学者可以不在这上面浪费时间
注2:本文所提的思考问题仅是一些有代表性的问题,仅代表C++知识的一小部分。
- C++11
C++ Primer第五版已经涉及,另外还有Effective Modern C++. C++11很重要,有很多改进需要了解和掌握,在程序中善于使用。这里举一些比较有代表性的, move sematic, rvalue reference, range based for loop, override keyword, static assert, initializer list, lambda, etc. Boost library的最常用内容已经包含在C++11中,建议先掌握C++11再关注Boost的其他内容。
- 软件开发环境
Version control. Git是主流,在老的开发组里可能还在使用SVN或者CVS。这是团队开发必须掌握的工具。
Testing. production code的设计要考虑到其可测试性,所有的代码在release之前都要经过测试。测试的设计,自动化等工作也是需要功夫的。
Build system. 常见的C++ build system有Make, CMake, Automake, scons, Visual Studio等,至少会使用一种。了解Gcc的使用,了解如何使用第三方库。
Debugging/Profiling tool: Valgrind memcheck, Cachegrind, gprof, OProfile, etc.
7.行业相关:衍生品定价系统
这样的系统以计算为核心,需要数值计算,并行计算的知识。现在GPU也比较流行,一般使用nVidia的CUDA. 并行计算也有使用MPI的。另外系统的跨平台特性和其他系统和语言的接口也是开发的要点之一。
8.行业相关:低延迟交易系统
交易系统注重对底层的了解。Memory alignment, multithreading, networking communication, cache friendliness, 如何保证系统的高可靠性,这些都是值得注意和学习的地方。建议学习SEC对Knight Capital trading error事件的调查报告https://www.sec.gov/litigation/admin/2013/34-70694.pdf, 以及SEC对Tower Research RegNMS violation的调查报告http://www.sec.gov/litigation/admin/2015/34-76029.pdf.
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
639368839,我们一起学C/C++!
C++进阶引导的更多相关文章
- android UI进阶之用ViewPager实现欢迎引导页面
ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ViewPager主要用来组织一组数据,并且通过左右滑动的方式来展示. ...
- android UI进阶之用ViewPager实现欢迎引导页面[转]
ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ViewPager主要用来组织一组数据,并且通过左右滑动的方式来展示. ...
- Acer宏碁暗影骑士3进阶版无法进入系统引导修复
1.刚开机时,按住alt不放,不停点击F10进入恢复系统: 2.点击疑难解答,选择cmd: 3.以下是cmd命令,//注释不要复制 c: //进入C盘 cd windows cd system32 b ...
- 一个不错的Node.js进阶学习引导
https://cnodejs.org/topic/58ad76db7872ea0864fedfcc
- SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)
前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块 ...
- SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
前言 本篇继续玩转模块的内容,关于索引在SQL Server的位置无须多言,本篇将分析如何利用Hint引导语句充分利用索引进行运行,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲 ...
- NSIS脚本入门和进阶方法
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序.它提供了安装.卸载.系统设置.文件解压缩等功能.对于新手来说,它有 ...
- Wireshark入门与进阶系列(一)
摘自http://blog.csdn.net/howeverpf/article/details/40687049 Wireshark入门与进阶系列(一) “君子生非异也,善假于物也”---荀子 本文 ...
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
随机推荐
- kafka入门
1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...
- java多线程基本概述(二十)——中断
线程中断我们已经直到可以使用 interrupt() 方法,但是你必须要持有 Thread 对象,但是新的并发库中似乎在避免直接对 Thread 对象的直接操作,尽量使用 Executor 来执行所有 ...
- 接触响应式-css3-media判断屏幕分辨率
// IE6.7.8不支持css3 使用响应式一般用bootstrap框架(IE8使用时须引用Respond.js)而不用原生JS 外联式: <link type="text/c ...
- 【转】JDBC学习笔记(9)——DBUtils的使用
转自:http://www.cnblogs.com/ysw-go/ 使用DBUtils提供的功能需要使用commons-dbutils-1.6.jar这个JAR包,在Apache官网可以下载到 使用D ...
- 实现TOLock过程中的一处多线程bug
背景 最近在啃<多处理器编程的艺术>,书中的7.6节介绍了时限锁--实现了tryLock方法的队列锁. 书中重点讲解了tryLock的实现,也就是如何实现在等待超时后退出队列,放弃锁请求, ...
- Java基础语法(一)<注释,关键字,常量,变量,数据类型,标识符,数据类型转换>
从今天开始,记录学习Java的过程.要学习Java首先得有环境,至于环境的安装我就不说了,百度有很多教程,比如:http://jingyan.baidu.com/article/20095761904 ...
- redis 主从配置实例、注意事项、及备份方式
这两天在配置线上使用的redis服务.总得看起来,redis服务的配置文件还是非常简洁.清楚,配置起来非常顺畅,赞一下作者. 下面是我使用的配置,使用主从模式,在master上关掉所有持久化,在sla ...
- java-cef嵌入基于Chrome内核浏览器,做页面爬虫(可以尽在ajax异步请求数据)
1 CentOS 7.0 上安装和配置 VNC 服务器 2.1 2.1.1 首先,我们需要一个可用的桌面环境(X-Window),如果没有的话要先安装一个. 注意:以下命令必须以 root 权限运行. ...
- Oracle与mysql的字段类型整理
Oralce的字段类型整理如下: Mysql的字段类型整理如下: 最后面一栏是对应JAVA的基本类型.希望对初学者有用,初学者在学习JAVA的时候,不知道怎么把JAVA的对象指向到ORALCE或者MY ...
- Mongodb以及rockmongo安装
Mongodb安装 以centos6.x_x_64位系统为例,我们使用yum安装 1.添加yum源 在/etc/yum.repos.d/目录下创建文件10genmon.repo(名字随意,.repo结 ...