Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >折叠表达式与编译递归

折叠表达式与编译递归
EN

Stack Overflow用户
提问于 2019-04-16 01:46:09
回答 3查看 843关注 0票数 2

c++17中,我们有折叠表达式,它可以极大地简化代码,否则可以使用编译器-递归和SFINAE或重载来实现。例如,在以下代码中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <utility>

template<typename ...Args>
void printer(Args&&... args) {
  (std::cout << ... << args) << '\n';
}

void printer_cpp11() { }

template <typename First, typename ...Args>
void printer_cpp11(First&& first, Args&&... args)
{
  std::cout << first;
  printer_cpp11(std::forward<Args>(args)...);
}

int main()
{
  printer(3, 4, "hello");

  std::cout << std::endl;

  printer_cpp11(3, 4, "hello");

  return 0;
}

c++17函数printer (取自cpp参考)执行与其c++11版本printer_cpp11完全相同的工作。

在编译时,会生成函数printer_cpp11的几个重载,而使用折叠表达式则需要一个函数printer

c++11-style相比,使用折叠表达式在性能上是否有优势?或者可以假设编译器插入了printer_cpp11的所有重载,从而创建了具有同等性能的代码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-16 06:26:53

由于内联,这两个版本都会产生相同的代码,因此运行时性能完全相同:https://gcc.godbolt.org/z/VIHTvZ (清理流杂乱的代码)。

然而,编译时间和内存使用预计要比递归实例化要好得多,因此,折叠表达式通常是首选的。更不用说,它们还提供了更清晰、更易于推理的代码。

票数 1
EN

Stack Overflow用户

发布于 2019-04-16 13:45:56

只需添加到@SergeyA的答案中,您就可以通过执行以下操作来减轻对c++11版本中递归和空函数的需求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename ...Args>
void printer_cpp11_norecursion( Args&&... args)
{
  using do_ = int[];
  do_{0,
    (std::cout << args,0)...
  };
}

这将产生与其他两个版本(https://gcc.godbolt.org/z/hyAyiz)相同的结果,在c++11上可能会有更好的编译时间。

票数 1
EN

Stack Overflow用户

发布于 2019-04-16 02:27:19

编译器将为每个具有不同参数的调用创建一个新的打印机实例,并在该函数中展开operator<<调用:

https://godbolt.org/z/Zz9Ik9

您还可以看到这里发生了什么:https://cppinsights.io/

但是最终--测量将揭示它是否会带来性能的提高。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55705215

复制
相关文章
递归与伪递归区别,Python 实现递归与尾递归
      递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
学到老
2019/02/14
1.5K0
递归与伪递归区别,Python 实现递归与尾递归
      递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归一般用于解决三类问题:  (1)数据的定义是按递归定义的。(n的阶乘)    (2)问题解法按递归实现。(回溯)    (3)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索) 递归的缺点:   递归解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,
学到老
2018/03/16
2K0
Java与Scala如何编译Lambda表达式?
Lambda表达式在过去几年中风靡编程世界。大多数现代语言都将它们作为函数式编程的基础部分。基于JVM的语言(如Scala,Groovy和Clojure)已将它们集成为语言的关键部分,本文将会对比Java与Scala在编译Lambda表达式上存在的差异
疯狂软件李刚
2020/06/24
1.4K0
递归的编译优化(1)
  本系列文章是想思考思考递归的编译优化问题,目标在于希望如何从编译、解释层次将树递归进行优化,从而避免过低效率运行。本章来讲讲树递归的问题。
窗户
2020/09/03
8220
递归与尾递归
  本博客前面介绍了不少跟递归的思想相关的例子,比如“汉诺塔”,“八皇后”等。因最近又回忆起“尾递归”,故本文通过2个例子再跟大伙儿探讨一下尾递归。。。
云海谷天
2022/08/09
7620
SQL 的递归表达式
MySQL 在 8.0 的版本引入了公共表表达式(Common Table Expressions),简称 CTE。CTE 在一些方面可以简化我们的 SQL 语句,让它看起来不至于太臃肿。
白日梦想家
2020/07/17
1.3K0
递归与尾递归
在介绍递归与尾递归之前,我们来看看递归的定义:程序调用自身的编程技巧称为递归( recursion)
踏浪
2019/11/28
9980
展开与折叠菜单动画
最简单的展开与折叠菜单,一般是通过切换display属性的none和block的值来实现。但是这样会使得整个过程非常的生硬,内容是一瞬间展示给用户,交互过程感觉不是特别好。我们加上动画以后让整个过程更加柔和。
_kyle
2020/08/24
3.7K0
展开与折叠菜单动画
matlab代码折叠与分节注释
matlab代码折叠与分节注释 觉得有用的话,欢迎一起讨论相互学习~ 通常函数或者循环过多,我们需要将代码折叠起来,matlab设置窗口如下图所示。 之后就能在左侧看见折叠的箭头了 但是,有时候想将
演化计算与人工智能
2020/08/14
1.8K0
matlab代码折叠与分节注释
递归与尾递归总结
关于递归的概念,我们都不陌生。简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。用递归需要注意以下两点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
狼啸风云
2019/11/05
7950
递归与尾递归简析
与之相对的是非尾递归函数,你先执行递归调用,然后获取递归调用的结果进行计算, 这样你需要先获取每次递归调用的结果,才能获取最后的计算结果。看下面计算n阶乘的函数,它是一个非尾递归函数。我们发现cal(n-1)返回的值被cal(n)使用,因此对cal(n-1)的调用并不是cal(n)所做的最后一步。
java达人
2020/12/16
8390
Python优化机制:常量折叠
英文:https://arpitbhayani.me/blogs/constant-folding-python
Python猫
2021/02/12
7900
编译原理文法详解_编译原理为什么存在递归文法
学完了词法分析,我们知道词法分析器将正则表达式转换成词法单元流,但对于这个记号流我们不知道是否能由正确的文法产生,因此我们需要通过语法分析器来检测其合法性。语法分析器的输出是一棵语法分析树(无论显性还是隐性),并且进行一些语法纠错处理。语法分析的整个过程大概就是我们先定义一个语法,再用相应的算法来检测我们的词法单元流是否符合该语法。这里主要讨论上下文无关文法构成的语法和自顶向下、自底向上的语法分析。
全栈程序员站长
2022/11/17
7690
编译原理文法详解_编译原理为什么存在递归文法
C++17常用新特性(十一)---折叠表达式
从C++17开始,可以使用二元操作符对形参包中的参数进行计算,这一特性主要针对可变参数模板进行提升。支持的二元操作符多达32个。例如,下面的函数将会返回传入的所有的参数的和。
CPP开发前沿
2022/06/04
1.6K0
动手写编译器:左递归消除和无歧义算术表达式解析代码实现
在前面章节中我们看到,语法生产式本质上指导了我们如何展开代码,例如对于生产式A->X Y Z,那么我们在解析A的时候,对于的代码就是:
望月从良
2022/04/27
3540
C/C++ 目录递归与结束递归
今天碰到了一个问题,我打算递归遍历整个 Windows 目录,找 后缀名为 .pf 的文件,如果找到了一个符合要求的文件就返回。
微软技术分享
2022/12/28
5980
lambda表达式-编译测试
我不会IL,也不想学IL,所以为了测试Lambda表达式编译的原理,只能使用调试进行试验来认识: 第一种情况,当Lambda表达式没有用到函数外的变量时: class MyClass2 { public Action TestLambda() { Action action = () => { Console.WriteLine(DateTime.Now); }; return action; }
用户1172223
2018/01/29
6750
lambda表达式-编译测试
Lambda表达式也能写递归吗
没错是这样的,我们在很多时候会用到递归树但是如果在数据库去写递归的SQL对数据库的压力就太大了,通常我们会一次性的都查出来在Java去进行递归的操作,我们这个操作要写好多代码而且思想基本都差不多,所以我们的Steam提供了这样一个方法toTree(),他可以定制的去进行集合转换为树的操作。 这里我感觉lambda能写递归感到这个思想很好玩所以这里给大家讲一下我写的源码
用户10136162
2022/11/15
5730
Lambda表达式也能写递归吗
全排列(递归与非递归实现)[通俗易懂]
E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)
全栈程序员站长
2022/07/07
8260
谷歌与递归
在讲解“递归”这个抽象概念之前,让我们来重温一下昔日往事。小时候,当我们在缠着长辈讲故事时,长辈们可能就用下面的故事来“忽悠”我们:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事!故事是什么呢?从前有座山,山里有座庙,庙里有个老和尚正在给小和尚讲故事!故事是什么呢……
用户1682855
2020/05/25
4750

相似问题

递归与折叠效率

20

递归类型的Elm -折叠与列表不编译。

14

长度与折叠与显式递归的性能特性

13

boost mpl折叠占位符表达式无法编译

10

把递归变成折叠?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文