使用C ++ 11的“自动”可以提高性能吗?

DaBrain:

我可以看到为什么autoC ++ 11中类型可以提高正确性和可维护性。我已经读过它也可以提高性能(Herb Sutter的Always Always Auto),但是我错过了一个很好的解释。

  • 如何auto提高性能?
  • 谁能举一个例子?
巴里:

auto可以避免隐式隐式转换,从而提高性能我发现一个令人信服的例子如下。

std::map<Key, Val> m;
// ...

for (std::pair<Key, Val> const& item : m) {
    // do stuff
}

看到错误了吗?在这里,我们认为我们正在通过const引用优雅地获取地图中的每个项目,并使用新的range-for表达式使我们的意图明确,但实际上我们正在复制每个元素。这是因为std::map<Key, Val>::value_typestd::pair<const Key, Val>,没有std::pair<Key, Val>因此,当我们(隐式)拥有:

std::pair<Key, Val> const& item = *iter;

不必引用现有对象并将其留在那儿,我们必须进行类型转换。只要存在隐式转换,就可以对其他类型的对象(或临时对象)进行const引用,例如:

int const& i = 2.0; // perfectly OK

该类型转换是可以转换一个同样的原因被允许的隐式转换const KeyKey,但我们必须建立一个临时的新型的,以允许这一点。因此,有效地,我们的循环可以做到:

std::pair<Key, Val> __tmp = *iter;       // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it

(当然,实际上没有__tmp对象,它只是用于说明,实际上,未命名的临时对象在item其生命周期中一直受到约束)。

只是更改为:

for (auto const& item : m) {
    // do stuff
}

刚刚为我们节省了很多副本-现在引用的类型与初始值设定项类型匹配,因此不需要临时或转换,我们可以直接进行引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我什么时候应该在常规线程上使用asyncio,为什么?它可以提高性能吗?

在Java中使用final关键字是否可以提高性能?

将多个线程与RandomAccessFile一起使用会提高性能吗?

带有ListenAndServe的Goroutine可以提高性能吗?

使用Three.js提高性能

C ++中的宏会提高性能吗?

在一对零/一的关系中,(MySQL,InnoDB)通过使用外键作为主键是否可以提高性能?

使用SQLite提高性能

如何使用Java ArrayList提高性能

在Flutter(Dart 2)中还是可以使用const关键字来提高性能吗?

使用SQL Server索引提高性能

昂贵的C#操作,希望提高性能

在更多线程中使用Python gRPC客户端存根时,可以提高性能吗?

仅使用一台计算机/节点时分区会提高性能吗?

使用DPC ++ oneAPI提高性能

可以缓存JSON以提高性能/加载时间吗?

为了提高性能,我应该记录到C:\或D:\驱动器中吗?

CUDA,使用共享内存可以提高我的性能吗?

使用可为空的结构是否可以提高性能?

将扫描线从位图复制到位图时,使用Parallel类会提高性能吗?

在加密卷上使用压缩文件系统是否可以提高性能?

使用投影可以提高Hibernate Search索引的构建性能吗?

我可以使用FileReader来读取包含图像和视频(例如epub文件)和文本的文件吗,是否建议这样做以提高性能?

使用局部对象提高性能

如何使用字典提高性能?

Matlab:如果“A”是索引变量,则可以使用逻辑索引而不是 FIND 来提高性能

如何使用递归代码提高性能

使用 cte ROW_NUMBER() 提高性能

C++ 中的 malloc 以提高性能