阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Herb Sutter 谈现代 C++ 本质

  • 2014-11-06
  • 本文字数:1621 字

    阅读完需:约 5 分钟

在 CppCon 2014 上,Herb Sutter 做了一个演讲,展示了现代 C++ 编程的基本惯用法。下面是一个简短的概要。

Herb 承认尽管 C++ 不是对每个程序员都是复杂的,但它是一个复杂的语言。Herb 建议这样来看待 C++,只有极少一部分程序员应该关注语言的最晦涩难懂的方面,比如当处理低层或库代码时,而其他人只需要通过默认的方式使用它,并让它能工作就可以了。

第一个例子是尽量多使用 range-for 循环。事实上,你也可以这样写:

复制代码
for (auto i = begin(c); i != end(c); ++i) { ... }

在现代 C++ 中,一个更容易的写法是这样的:

复制代码
for (auto& e : c) { ... }

这种写法也提供了更好的可读性。

指针、引用、new delete

Herb 的另一个强烈的建议是除非被封装在低层数据结构的实现内部,否则不要使用有所有权的指针(owning pointer)new 或者 delete。一个更好的选择是 unique_ptr,或者当你知道你需要共享这个对象的时候,使用 shared_ptr。因此,你可以很容易地写成:

复制代码
auto p = make_unique<widget>();
auto q = make_shared<widget>();

通过使用 make_unique 和 make_shared,你甚至不用担心 delete 的问题。

不管怎样,无所有权的指针(non-owning pointer)和引用仍然是一个很好的资源,并且使用它们最好的场合是传递参数给函数。Herb 认为使用任何种类的引用计数变量来传递参数是一种真正的反模式。这只可能导致性能问题,只有当你想把封装对象的所有权转移出去的时候才应该用它。

尽量多使用auto来声明局部变量

据 Herb 的说法,auto 关键字是现代 C++ 最大的特性之一。auto 能够用来推断类型,但是也可以用来指定类型并且一直代表那种类型。考虑下面的语句:

复制代码
auto i = v.begin();

这将正确地推断出所使用的类型。相比于下面的语句,这更简单并且不需要太多思考就能写出来。

复制代码
vector::const_iterator i = v.begin();

上面的语句专门需要思考使用 const_iterator。

正确性是 auto 的最大好处,但是它也有其他方面的好处:

· 可维护性:它使得代码自动适应变化,比如,函数的返回值。

· 性能:作为正确类型推断的必然结果,auto 能避免无意中产生临时对象,比如,初始化一个对象的时候。

· 可用性:在特殊的上下文中,比如,auto 是 lambda 函数的一个促成因素。

· 打字方便:它可以少敲几下键盘。

然而,有些情况下你不能使用 auto,换句话说,当你处理 C 数组或者不可移动的类型或者移动起来开销太大的类型,比如:

复制代码
auto lock = lock_guard<mutext> { m };  // 错误:不可移动
auto ai = atomic<int>{}; // 错误:不可移动
auto a = array<int,50>{}; // 正确,但开销太大

参数传递

Herb 演讲的很大一部分都专注在讨论参数传递。他的要点是,C++98 默认用法在现代 C++ 中还继续有效,并且代表了一个很好的起点,而右值优化带来更多的可能性。下面这个例子说明我们总是应该怎么做:

复制代码
class employee {
std::string name_;
public:
void set_name(const std::string& name) { name_ = name; } // 标准 C++98 的习惯
void set_name(std::string&& name) noexcept { name_ = std::move(name); } // 右值优化
};

另一方面,Herb 建议值传递主要用在构造函数中。在其他场合,当你按值传递一个命名参数(也即,非临时对象),并且允许右值优化,会引起很大的性能影响,因为该参数会被拷贝。

元组

Herb 最后一个建议是关于使用元组来返回多个值:

复制代码
tie(iter, success) = myset.insert("Hello");
if (success) do_something_with(iter);

除了强调默认用法和惯用法的重要性,Herb 也建议避免过度思考从而导致解决方案过度混淆。总之,他的秘诀是首先与语言提供的最基础的用法保持一致,然后通过实测,找到一些有希望改进的领域,尝试一些不一样的手段来改进性能。

查看英文原文: Herb Sutter on Modern C++ Essentials


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-11-06 03:515454

评论

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

Wireshark网络工具是什么?

小魏写代码

无服务器开发实例|微服务向无服务器架构演进的探索

亚马逊云科技 (Amazon Web Services)

Serverless 微服务 API Amazon Lambda Amazon API Gateway

一文看懂:5分钟玩转容器云,彻底化解业务上云烦恼

统信软件

软件测试/测试开发/人工智能丨视觉与图像识别自动化测试

测试人

人工智能 软件测试

BetterDisplay Pro for Mac(显示器校准软件)

展初云

Mac软件 BetterDisplay

ON1 Photo RAW 2024 for Mac(RAW照片编辑软件)

展初云

Mac 照片编辑软件

现身说法:2023中级程序员进阶之路

伤感汤姆布利柏

程序员 程序员成长

PullTube for Mac(在线视频下载工具)

展初云

视频下载 Mac软件

使用 VuePress 和 Vercel 打造个人技术博客:实现自动化部署

小白Coding日志

GitHub 个人博客 自动部署 Vuepress2.X Vercel

SynVision AI: 虚拟助手的革命

Synvision.AI

人工智能 AI 智能助手 问答助手 聊天助手

Amazon EC2 新手初探:操作我们的实例

王强

Amazon EC2 亚马逊云服务器

NFTScan | 11.13~11.19 NFT 市场热点汇总

NFT Research

NFT\ NFTScan nft工具

AWS向量数据库Amazon OpenSearch Service使用测评

i查拉图斯特拉如是说

亚马逊云科技 向量数据库 opensearch service

00后如何组织双十一大促看这一篇就够了! | 京东云技术团队

京东科技开发者

监控 电商大促 容灾备份 企业号11月PK榜 大促备战

Keyboard Maestro for mac(苹果键盘热键软件) v11.0.1完美激活版

mac

苹果mac Windows软件 Keyboard Maestro 键盘快捷键工具

关注潜在的整数越界问题 | 京东物流技术团队

京东科技开发者

spring 企业号11月PK榜 整数越界

向量数据库——AI时代的基座

陈老老老板

#人工智能

Mac电脑屏幕录像推荐:Iris激活最新版

mac大玩家j

屏幕录制 录屏软件 Mac软件

AWS云服务器EC2实例实现ByConity快速部署

乌龟哥哥

AWS

在你购买小间距led显示屏时需要注意这些事项

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

CSS 新特性,建议收藏!

秃头小帅oi

CSS 前端

Xmind for Mac(思维导图软件) 24.01中文版

加油,小妞!

思维导图 mac软件下载

达达埋点迁移京东子午线实践 | 京东云技术团队

京东科技开发者

埋点设计 企业号11月PK榜 埋点迁移 架构迁移

高效开发与设计:提效Spring应用的运行效率和生产力 | 京东云技术团队

京东科技开发者

spring 性能优化 SpringBoot启动流程 企业号11月PK榜

使用1688开放平台API接口获取商品详情信息

Noah

Mac电脑视频剪辑Final Cut Pro激活版中文最新

胖墩儿不胖y

Mac软件 视频处理工具 视频剪辑软件 视频编辑器

解锁未来:通过数字孪生和区块链进行物联网管理

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

Navicat 基于 GaussDB 主备版的快速入门

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

Amazon EC2 新手初探:更多实例连接方式

王强

Amazon EC2 亚马逊云服务

Herb Sutter谈现代C++本质_C++_Sergio De Simone_InfoQ精选文章