NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

开发者应该开始学习 C++ 吗?

  • 2012-12-20
  • 本文字数:1697 字

    阅读完需:约 6 分钟

随着 C++ 11 C++ CX 的引入,很多人重新燃起了对这门语言的兴趣。不少开发者,尤其是 Windows 开发者,都想知道是否应该放弃 C#和 Java,转而支持 C++。John Sonmez 认为这并不需要。

在“为什么 C++ 并没有‘王者归来’( Why C++ Is Not ‘Back’)”一文中,John Sonmez 认为只有如下三个原因才会使用 C++:

  • 需要榨干软件每一寸可能的性能,并且想用支持面向对象抽象的语言来实现。
  • 编写直接面对硬件的代码。(例如,编写底层驱动。)
  • 内存控制与定时极为重要,因而系统的行为必须是完全确定的,还必须能够手动管理内存。(想一下控制机器移动部件的嵌入式实时操作系统。)

Herb Sutter 高度称赞了这篇文章,认为文中的“观点有些深度,没有夸张”。关于 C++ 的应用场景,他又做了一些补充:

  • 服务,依赖于运行时会更为困难。
  • 测试,对比一下全部或者大部分采用静态链接的应用程序与在最终用户机器上往往是首次执行时才编译或即时编译(JIT)的应用程序,后者无法完整地测试。

John Sonmez 反对学习 C++,过于复杂是原因之一。即使 C++ 11 让开发容易了一些,但是程序员仍然不得不学习各种老式的 C++ 编码方法。“你会碰到 20 年前的 C++ 代码,看起来就像是完全不同的语言。”为了加强其观点,他向准备应聘 C++ 职位的开发者提出了 36 个问题。下面列出几条:

1. 在 C++ 中,基本数据类型有多少种初始化方式?你能都说出来吗?
12. 什么是复制构造函数,何时会用到?尤其是与赋值操作符相比,你能区分吗?
16. 在 C++ 中,何时适合通过引用来返回值,何时不适合?
33. 为什么绝对不应该在析构函数中抛出异常?

反对 C++ 的另一个理由是“编程语言真正需要的是简化并提高抽象层次,而不是反其道而行之”。他继续道,

编写底层代码的需求总是存在的,但我们今天编写的大部分都是较高层次的代码。

很多年前,当我终于无法再坚持认为我用 C++ 开发应用的速度比 C#快时,我跳下了 C++ 这条船。

我坚持良久,试图让自己相信我在 C++ 上的所有投入并没有白费,但是事实证明, C#带来的简化是如此之大,以至于与此相比,C++ 所提供的额外的力量并不值得这些额外的付出。

在文章结尾,John Sonmez 说到,学习 C++ 对于理解计算机的一般工作原理仍然是有用的,“但是我认为 C++ 不会东山再起,这是好事”。

关于这一点,Alo 补充到:

我是从 C++ 开始的,而且我职业生涯的前四年都花在了 C++ 上。这种经验对我非常有价值,正如您的文章中所指出的那样,因为一旦把 C++ 学到了足够的水平,就可以很快地捡起其他任何语言;此外,还能从一个更低的层次上更深刻地理解软件工作原理——如果从其他层次更高的语言开始学习编程,获得这种知识的难度就大多了。正因如此,我一直不赞成让程序员从 Java 开始学起。

Richard Dunks 反驳到:

我认为,在第一学期的程序设计导论课程和数据结构的教学中,C++ 是没什么帮助的,因为光实现就要耗费很多时间,反而让同学们忽略了他们要复现的结构。我很高兴自己能够精通 C++,但我认为这并不值得,而且 C++ 绝对不是一门万能的教学语言。

Stephen Cleary 有一条评论谈到了可重用性:

我原来是 C++ 开发者,几年之前,市场的压力让我成了一名 C#开发者。C#的确更有生产率,但是完全不可能实现 C++ 模板那种级别的代码复用。

经典的例子就是容器、迭代器和算法这三驾马车。在 C++ 中,能够创建一个用于任何容器的算法,而且可以在编译时对算法加以调整以便必要的情况下利用随机访问能力。你可以用 C#试试。这还是尚未谈到“新 C++”的情况;1998 年的 C++ 对代码复用的支持就比现在的 C#好了。

关于性能,Herb Sutter 给出了如下建议:

在任何语言中,如果非常关注性能,都会大量使用数组(未必“总是”使用,只是“大量”用到)。不过这在有些语言中很容易,可以很好地控制一般内存布局,特别是控制数组;而在其他语言或环境中就困难一些(有可能让你使用,但更为困难),如果这些语言或运行时特别偏爱通过指针构造的数据结构,你就不得不“放弃”或者“尽量避开”。

除了在 Herb Sutter 和 John Sonmez 的相关博客上的大量高质量评论,Reddit 的 Programming Coding 子群组也有很多可以学习的东西。

参考英文原文 Should Developers Start Learning C++?

2012-12-20 04:477666
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 130.3 次阅读, 收获喜欢 34 次。

关注

评论

发布
暂无评论
发现更多内容

Linux系统编程-(pthread)线程通信(信号量)

DS小龙哥

信号量 2月月更

2021 年软件安全报告:代码开源,福“祸”相依?

腾源会

开源 安全

实战领域驱动设计开篇

worry

领域驱动设计 DDD 领域驱动 Domain Driven Design

阿里云张献涛:自主最强DPU神龙的秘诀

阿里云弹性计算

阿里云 神龙架构 DPU

DC系列靶机知识点总结

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

浅析PHP伪协议在CTF的应用

喀拉峻

网络安全

关于 docker-compose stop 和 docker-compose start 的误解

liuzhen007

容器 云服务 2月月更

Kotlin语法手册(一)

寻找生命中的美好

android kotin

Linux系统编程-Shell脚本基本使用(变量、运算符、语句等)

DS小龙哥

shell脚本编写 2月月更

如何将Perforce Helix Core与CI构建服务器结合使用

龙智—DevSecOps解决方案

ci 持续集成 持续交付 CD

网络安全kali渗透学习 web渗透入门 如何进行基于ping命令的探测

学神来啦

基于云开发的健身房预约小程序平台

CC同学

浅谈AI机器学习及实践总结 | 社区征文

张浩_house

机器学习 数据工程 机器学习算法 新春征文

基于 Kyma 的企业级云原生应用的扩展案例分享 | 社区征文

Jerry Wang

Kubernetes 云原生 新春征文 2月月更 Kyma

AI+Science:基于飞桨的AlphaFold2,带你入门蛋白质结构预测

百度开发者中心

百度AI

一手实录!朱广权的AI手语搭档是怎样“养成”的?

百度开发者中心

百度智能云 百度AI

玉米可流转数字仓单标准的落地 将加速行业的资产数字化进程

CECBC

裁员,降薪,大牛出走:AI大退却的始末缘由

脑极体

区块链通证经济:通往未来十年财富分配的新格局

CECBC

模块八作业

Geek_e6f7f6

架构实战营

【架构训练营模块二作业】分析一下微信朋友圈的高性能复杂度

yhjhero

#架构训练营

RTE2021 回顾丨实践中的摸爬滚打,AI OPS 落地之路

声网

人工智能 算法 Ops

区块链+体育发展提速 区块链球员数据系统预计上半年投入使用

CECBC

Linux系统编程-(pthread)线程通信(自旋锁)

DS小龙哥

自旋锁 2月月更

百度智能云开物再收“一个奖状”

百度开发者中心

工业互联网 百度智能云 百度智能云开物

加入科学计算SIG,挑战最前沿的AI+Science研发与创新

百度开发者中心

百度AI

Web Components 系列(五)—— 关于 Templates

编程三昧

前端 组件化 2月月更

电商直播选品该怎么做?有没有好用的工具?

优秀

带货 直播 低代码开发

Apache APISIX 存在改写 X-REAL-IP header 的风险公告(CVE-2022-24112)

API7.ai 技术团队

IP 漏洞 Apache APISIX APISIX 网关

全球案例 | 一家有着百年历史的航空公司如何扩展和转型,推动航空业创新

龙智—DevSecOps解决方案

Atlassian Jira 航空公司

欧拉的奇异之旅·风暴来临与欧拉初诞

脑极体

开发者应该开始学习C++吗?_C++_Jonathan Allen_InfoQ精选文章