为什么这个 constexpr 代码会导致 GCC 吃掉我所有的 RAM?

2024-03-10

以下程序将调用fun2 ^ (MAXD + 1) 次。不过,最大递归深度永远不应该超过 MAXD(如果我的想法是正确的)。因此,编译可能需要一些时间,但它不应该占用我的内存。

#include<iostream>

const int MAXD = 20;

constexpr int fun(int x, int depth=0){
  return depth == MAXD ? x : fun(fun(x + 1, depth + 1) + 1, depth + 1);
}

int main(){
  constexpr int i = fun(1);
  std::cout << i << std::endl;
}

问题是,它确实会吃掉我的内存。当我将 MAXD 调至 30 时,我的笔记本电脑在 GCC 4.7.2 快速分配 3 GB 左右后开始交换。我还没有尝试过 clang 3.1,因为我现在无法访问它。

我唯一的猜测是,这与 GCC 试图过于聪明并记住函数调用有关,就像它对模板所做的那样。如果是这样,那么他们对记忆量(例如 MRU 缓存表的大小或其他内容)没有限制,这难道不奇怪吗?我还没有找到禁用它的开关。

我为什么要这样做? 我正在考虑制作一个高级编译时库,比如遗传编程之类的。由于编译器没有编译时尾调用优化,我担心任何循环都需要递归,并且(即使我打开最大递归深度参数,这看起来有点难看)会快速分配我所有的 RAM 并填充它带有毫无意义的堆栈帧。因此,我想出了上述解决方案,可以在没有深堆栈的情况下获得任意多个函数调用。这样的功能可用于折叠/循环或蹦床。

编辑: 现在我已经在 clang 3.1 中尝试过了,它根本不会泄漏内存,无论我让它工作多长时间(即我使 MAXD 有多高)。正如预期的那样,CPU 使用率几乎为 100%,内存使用率几乎为 0%。也许这只是 GCC 中的一个错误。


这可能不是关于 constexpr 的权威文档,但它是从gcc constexpr 维基。 http://gcc.gnu.org/wiki/Constexpr

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf

...它说...

我们(仍然)禁止常量表达式中的所有形式的递归。 这并不是严格必要的,因为实施限制 常量表达式求值中的递归深度将使我们免于 编译器永远递归的可能性。然而,直到我们 看到一个令人信服的递归用例,我们不建议允许它。

所以,我希望您会遇到语言边界以及 gcc 选择实现 constexpr 的方式(可能尝试内联生成整个函数,然后评估/执行它)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个 constexpr 代码会导致 GCC 吃掉我所有的 RAM? 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj

随机推荐

  • Matplotlib:如何将时间戳与broken_barh一起使用?

    我有一个 pandas 数据框 其中时间戳作为索引和列中的数值 我想使用broken bar来绘制矩形以突出显示时间序列的某些部分 如何将时间戳与broken barh一起使用 df plot ax ax ax broken barh st
  • Microsoft.AspNet.Identity 的自定义成员资格 - CreateLocalUser 失败

    我一直在尝试使用 Visual Studio 2013 在 ASP NET 4 5 Microsoft AspNet Identity 中实现新身份功能的自定义版本 经过几个小时的尝试后 我简化了我的代码努力使其无错误地运行 我在下面列出了
  • OAuth“unsupported_grant_type”Discord API

    我正在努力让不和谐的 OAuth 发挥作用 在文档中 需要生成代码 这一步效果很好 但之后是生成令牌 它要求使用正确的参数发出 POST 请求 但它总是给我带来错误 error unsupported grant type My code
  • 如何使用 addHandler 引发事件

    我对 Vb Net 事件和处理程序感到满意 任何人都可以帮助我如何在 C 中创建事件处理程序并引发事件 只了解 C 或只了解 VB Net 的开发人员可能不知道 这是 VB NET 和 C 之间较大的区别之一 I will 无耻地复制 ht
  • 检查迭代器的类型是否为reverse_iterator

    有没有办法检查作为arg传递给fnc的迭代器是否是reverse iterator 有没有我可以使用的迭代器特征函数 编写部分专业化的代码很简单 include
  • 动态创建树视图

    我正在尝试使用 c 和 asp net 动态创建树视图 我使用 populate ondemand 属性创建了一个延迟加载树视图 gt
  • 包括库在Android项目中使用的共享对象

    我的 Android 项目正在使用具有本机代码的 Android 库项目 并且我得到了UnsatisifiedLinkError来自库使用的本机函数 我已将库使用的这些共享对象包含在项目的 Android mk 文件中 并将它们正确复制到
  • Java 中 JTable 的两个单元格之间的乘法

    当我在 单位 和 价格 列第一行的单元格中输入值时 金额 列 列单元格值应设置为 unit 和 amount 的乘积 我应该使用哪个监听器 请帮忙 因为我是 Java 新手 CODE JTable jTable1 DefaultTableM
  • Pyinstaller - 加载 Python DLL 时出错 - FormatMessageW 失败

    我编译了我的 py文件运行以下命令 pyinstaller myfile py onefile 当我在我的上运行它时pc Windows 10 一切都很好 当我尝试在我的 虚拟机 Windows 8 上运行它时 我收到以下错误 加载 Pyt
  • 部署到 Heroku 失败。移动文件与节点版本不兼容

    我正在努力将新的 Rails 6 应用程序部署到 Heroku 它在我本地运行良好 在部署过程中 我收到以下输出 不幸的是 我对 webpack 和 Yarn 还很陌生 这似乎是 move file 的版本 依赖关系问题 而 move fi
  • 插入附近的语法不正确

    我是学生 这是家庭作业 表在那里 但没有插入数据 感谢您的任何建议 Msg 156 Level 15 State 1 Line 181 Incorrect syntax near the keyword INSERT SQL语句 USE M
  • 在字符串中的某些字符之前和之后添加空格

    我想在字符串中的某些字符之前和之后添加空格 var x asdasdasdasd adasdasdasd asdasdasdasd asdasdasd asdasdasd asdasdasdadasdasd 我想在前后添加空格 var se
  • 包括标签和数据绑定

    我想在同一视图中多次使用我的布局之一include 假设我有一个custom xml包括一些TextViews custom xml
  • Reactjs不加载文本字体

    我在用React with Typescript and Styled Component我无法上传文本字体 只有字体可以不在浏览器中加载 我所拥有的是以下 字体 ts import css from styled components e
  • MFMessageComposeViewController 和 iMessage

    我正在构建一个有按钮的应用程序 如果您触摸该按钮 则会出现MFMessageComposeViewController将显示 并填写正文和一名收件人 该收件人是 4343 这是比利时短信的简码 这里错误的是MFMessageComposeV
  • 如何捕获 paypal webhook?

    我已在我的网站中集成了 PayPal 智能按钮createOrder and Capture在服务器端处理 付款完成后 交易即可在业务沙箱帐户上使用 并且webhook事件在 Webhooks 事件页面中注册 The webhook POS
  • Apache 模块命令解析器原型

    我正在创建 Apache2 模块并遇到奇怪的编译问题 这是我的函数的原型 用于解析名为 的配置命令分析IP static const char apr cfg set analytics ip cmd parms cmd void conf
  • tensorflow conv2d内存消耗解释?

    output tf nn conv2d input weights strides 1 3 3 1 padding VALID My input形状为 200x225x225x1 weights是 15x15x1x64 因此 output形
  • nbactions.xml 有何用途?

    经过一段时间的搜索后 我认为这与使用 Maven 和 Net beans 构建应用程序有关 但我似乎找不到这方面的良好文档 使用 nbaction xml 可以实现哪个目标 如果有的话 哪一个与 Eclipse 等效 The nbactio
  • 为什么这个 constexpr 代码会导致 GCC 吃掉我所有的 RAM?

    以下程序将调用fun2 MAXD 1 次 不过 最大递归深度永远不应该超过 MAXD 如果我的想法是正确的 因此 编译可能需要一些时间 但它不应该占用我的内存 include