【VC++开源代码栏目提醒】:以下是网学会员为您推荐的VC++开源代码-C++学习之道 pdf - 技术总结,希望本篇文章对您学习有所帮助。
1 从《C Primer 第四版》入手学习C 为什么要学习C 2009 年本书作者 Stan Lippman 先生来华参加上海祝成科技举办的C技术大会他表示人们现在还用C的惟一理由是其性能。
相比之下Java/C/Python等语言更加易学易用并且开发工具丰富它们的开发效率都高于C。
但C目前仍然是运行最快的语言1如果你的应用领域确实在乎这个性能那么 C 是不二之选。
这里略举几个例子2。
对于手持设备而言提高运行效率意味着完成相同的任务需要更少的电能从而延长设备的操作时间增强用户体验。
对于嵌入式3设备而言提高运行效率意味着实现相同的功能可以选用较低档的处理器和较少的存储器降低单个设备的成本如果设备销量大到一定的规模可以弥补C开发的成本。
对于分布式系统而言提高10的性能就意味着节约10的机器和能源。
如果系统大到一定的规模数千台服务器值得用程序员的时间去换取机器的时间和数量可以降低总体成本。
另外对于某些延迟敏感的应用游戏4金融交易通常不能容忍垃圾收集GC带来的不确定延时而C可以自动并精确地控制对象销毁和内存释放时机5。
我曾经不止一次见到出于性能原因用C重写现有的Java或C程序。
C之父Bjarne Stroustrup把C定位于偏重系统编程system programming 6的通用程序设计语言开发信息基础架构infrastructure是C的重要用途之一7。
Herb Sutter总结道8C注重运行效率efficiency、灵活性flexibility9和抽象能力abstraction并为此付出了生产力productivity方面的代价10。
用本书作者的话来说C is about efficient programming with abstractions。
C的核心价值在于能写出“运行效率不打折扣的抽象11”。
1 见编程语言性能对比网站 http://shootout.alioth.debian.org/ 和Google 员工写的语言性能对比论文 https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf 2 C之父Bjarne Stroustrup维护的C用户列表http://www2.research.att.com/bs/applications.html 3 初窥C在嵌入式系统中的应用请见http://aristeia.com/TalkNotes/MISRA_Day_2010.pdf 4 Milo Yip在《C强大背后》提到大部分游戏引擎如Unreal/Source及中间件如Havok/FMOD是C实现的。
http://www.cnblogs.com/miloyip/archive/2010/09/17/behind_cplusplus.html 5 孟岩《垃圾收集机制批判》C利用智能指针达成的效果是一旦某对象不再被引用系统刻不容缓立刻回收内存。
这通常发生在关键任务完成后的清理clean up时期不会影响关键任务的实时性同时内存里所有的对象都是有用的绝对没有垃圾空占内存。
http://blog.csdn.net/myan/article/details/1906 6 有人半开玩笑地说“所谓系统编程就是那些CPU时间比程序员的时间更重要的工作。
” 7 《Software Development for Infrastructure》 http://www2.research.att.com/bs/Computer-Jan12.pdf 8 Herb Sutter在C and Beyond 2011会议上的开场演讲《Why C》 http://channel9.msdn.com/posts/C-and-Beyond-2011-Herb-Sutter-Why-C 9 这里的灵活性指的是编译器不阻止你干你想干的事情比如为了追求运行效率而实现即时编译just-in-time compilation。
10 我曾向Stan Lippman介绍目前我在Linux下的工作环境编辑器、编译器、调试器他表示这跟他在1970年代的工作环境相差无几可见C在开发工具方面的落后。
另外C的编译运行调试周期也比现代的语言长这多少影响了工作效率。
11 可参考Ulrich Drepper在《Stop Underutilizing Your Computer》中举的SIMD例子。
http://www.redhat.com/f/pdf/summit/udrepper_945_stop_underutilizing.pdf 2 要想发挥C的性能优势程序员需要对语言本身及各种操作的代价有深入的了解12特别要避免不必要的对象创建13。
例如下面这个函数如果漏写了amp功能还是正确的但性能将会大打折扣。
编译器和单元测试都无法帮我们查出此类错误程序员自己在编码时须得小心在意。
inline int find_longestconst std::vectorltstd::stringgtamp words // std::max_elementwords.begin words.end LengthCompare 在现代CPU体系结构下C 的性能优势很大程度上得益于对内存布局memory layout 的精确控制从而优化内存访问的局部性14locality of reference并充分利用 内存阶层memory hierarchy 提速15这一点优势在近期内不会被基于GC的语言赶上16。
C的协作性不如C、Java、Python开源项目也比这几个语言少得多因此在TIOBE语言流行榜中节节下滑。
但是据我所知很多企业内部使用C来构建自己的分布式系统基础架构并且有替换Java开源实现的趋势。
学习C只需要读一本大部头 C不是特性features最丰富的语言却是最复杂的语言诸多语言特性相互干扰使其复杂度成倍增加。
鉴于其学习难度和知识点之间的关联性恐怕不能用“粗粗看看语法就撸起袖子开干边查Google边学习17”这种方式来学习C那样很容易掉到陷阱里或养成坏的编程习惯。
如果想成为专业C开发者全面而深入地了解这门复杂语言及其标准库你需要一本系统而权威的书这样的书必定会是一本八九百页的大部头18。
兼具系统性和权威性19的C教材有两本C之父Bjarne Stroustrup的代表作《The C Programming Language》和Stan Lippman的这本《C Primer》。
侯捷先生评价道“泰山北斗已现又何必案牍劳形于墨瀚书海之中这两本书都从C盘古开天以来一路改版斩将擎旗追奔逐北成就一生荣光20。
” 从实用的角度这两本书读一本即可因为它们覆盖的C知识点相差无几。
就我个人的阅读体验而言Primer更易读一些我十年前深入学习C正是用的《C Primer第三版》。
12《Technical Report on C Performance》 http://www.open-std.org/jtc1/sc22/wg21/docs/18015.html 13 可参考Scott Meyers的《Effective C in an Embedded Environment》 http://www.artima.com/shop/effective_cpp_in_an_embedded_environment 14 我们知道std::list的任一位置插入是O1操作而std::vector的任一位置插入是ON操作但由于std::vector的元素布局更加紧凑compact很多时候std::vector的随机插入性能甚至会高于std::list。
见http://ecn.channel9.msdn.com/events/GoingNative12/GN12Cpp11Style.pdf 这也佐证std::vector是首选容器。
15 可参考Scott Meyers的技术报告《CPU Caches and Why You Care》和任何一本现代的计算机体系结构教材 http://aristeia.com/TalkNotes/ACCU2011_CPUCaches.pdf 16 Bjarne Stroustrup有一篇论文《Abstraction and the C machine model》对比了C和Java的对象内存布局。
http://www2.research.att.com/bs/abstraction-and-machine.pdf 17 语出孟岩《快速掌握一个语言最常用的50》 http://blog.csdn.net/myan/article/details/3144661 18 同样篇幅的Java/C/Python教材可以从语言、标准库一路讲到多线程、网络编程、图形编程。
19 “权威”的意思是说你不用担心作者讲错了能达到这个水准的C图书作者全世界也屈指可数。
20 侯捷《大道之行也——C Primer 3/e译序》 http://jjhou.boolan.com/cpp-primer-foreword.pdf 3 这次借评注的机会仔细阅读了《C Primer第四版》感觉像在读一本完全不同的新书。
第四版内容组织及文字表达比第三版进步很多21第三版可谓“事无巨细、面面俱到”第四版重点突出详略得当甚至篇幅也缩短了这多半归功于新加盟的作者Barbara Moo。
《C Primer 第四版》讲什么适合
上一篇:
静态链接库
下一篇:
性病门诊非淋菌性泌尿生殖道感染965例支原体检测及