为什么使用 boost::multi precision::cpp_int 会影响这里的尾调用优化

2023-12-13

我有一些模板化代码,编译器可以对大多数数据类型进行尾部调用优化,但不能对其他数据类型进行尾部调用优化。代码实现了pow()

template<typename T, typename U>
void powRecurse(T& x, U& y, T& acc)
{
   if(y == 0) {
      acc = Identity<T>;
      return;
   }
   if(y == 1) {
      acc = acc * x;
      return;
   }
   if(y % 2 == 1) {
      acc = acc * x;
      y = y - 1;
   }
   x = x*x; 
   y = y/2;
   powRecurse<T, U>(x, y, acc);
}

template<typename T, typename U>
T tailPow(T x, U y)
{
   T rv = Identity<T>;
   powRecurse<T, U>(x, y, rv);
   return rv;
}

参数 T 的类型似乎对尾部调用优化没有影响,我尝试过的任何类型都可以使用参数 U 的正确类型进行尾部调用优化。如果参数 U 是 uint64_t ,则编译器可以尾部调用优化。如果它是 boost::multi precision::cpp_int 那么编译器不会尾部调用优化。

我还尝试将 uint64_t 包装在一个类中,并在 int 类型上包装一个模板包装器,这两个尾部调用都进行了优化。

有什么理由不应该尾部调用优化吗?显然我可以循环这个,但我真的只是想理解这里的语言或编译器问题。


惰性求值意味着所有“递归”函数调用实际上都是不同的函数模板实例化。

参见例如这里有类似的讨论:

  • Boost 多精度:递归模板实例化超出最大长度 256
  • or here 如何将 sqrt 和 ceil 与 Boost::multi precision 一起使用?

因此,您可以通过选择退出惰性求值模板表达式来获得您期望的所有 tail-coll 实现细节(boost::multiprecision::et_off如链接中所述),但请务必检查减少的代码大小和感知的 TCO 优化actually导致性能提高。

实际上,某些算法受益于表达式模板,这些模板可以跳过常见的子表达式、重新排序无损操作等。

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

为什么使用 boost::multi precision::cpp_int 会影响这里的尾调用优化 的相关文章

  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • Monotouch全局异常处理

    我在野外发现了一只令人讨厌的虫子 但我无法确定它的具体情况 有没有办法拥有全局 Try Catch 块 或者有办法处理 Monotouch 中未处理的任何异常 我可以包起来吗UIApplication Main args 在 try cat
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • 如何优化 Three.js 中多个 sphereGeometry 的渲染?

    我想优化 Three js 中 sphereGeometry 的渲染 因为它成为我的程序的瓶颈 javascript程序如下所示 var sphereThree for var idSphere 0 idSphere lt numSpher
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex

随机推荐

  • Python:如何设置Python请求的参数

    我有这个可以运行的 python 请求代码 但我不明白参数代表什么 我想了解如何设置 python 请求的参数以及是否有很好的参考 这是我使用的代码 url https www walmart com store 1003 York pa
  • “ASN1 损坏了数据。”替换公钥但不替换私钥时出错

    学习使用 RSA 签名的机制 我有一个可以在下面运行的代码块 var privateRSAKey File ReadAllText RSAPrivateKey txt Trim Regex privateRSAKeyRegex new Re
  • 关于 ruby​​ 中“获取”的问题[重复]

    这个问题在这里已经有答案了 我想知道为什么当我尝试获取不同的输入时 它会忽略我的第二个输入 usr bin env ruby Class Definitions class Animal attr accessor type weight
  • 检测设备会话何时过期

    我想使用 devise 来记录用户会话何时超时 timeoutable 眼下 timeoutable正在按预期工作 并在指定的不活动时间后将用户重定向到登录页面 但除此之外 我们还希望在发生这种情况时进行记录 以帮助优化我们的超时期限 显然
  • Composer 中的自动增量字段

    创建 Asset 实例时是否有可用的 auto increment 字段类型 例如 资产 ID 应该是自动生成的字段 并且应该在运行时创建 而不是在应用程序级别提及该值 我可以通过创建一个交易处理器函数来检查资产列表并添加 1 作为替代方案
  • 通过 svg 路径滚动移动图像

    我想通过滚动上的 svg 路径移动对象 我试图将滚动上的部分路径添加到路径中 但它仍然不起作用 救命 https jsfiddle net YuriiBielozertsev Ltx9ed0L
  • ColdFusion 表单中的复选框

    我的代码如下 页面加载时 我需要默认选中这两个复选框 这将显示查询的结果 现在 当取消选中其中一个复选框时 需要提交表单并需要显示不同的查询结果 即使我取消选中复选框 这些复选框也始终会被选中 有人可以在这里指导我吗
  • 如何在java spring boot中将字节数组作为内存文件返回?

    我有一个字节数组作为数据 现在 如何使用 Spring Boot 编写一个控制器方法来将此字节数组作为文件返回 如果我用这个字节数组数据创建一个文件 那么我还应该删除它 对吗 有没有办法将此字节数组作为文件发送 而不必在我的项目中物理创建文
  • 如何获取相机应用程序的包名

    感谢之前的回复 是否可以获取设备上安装的相机应用程序的包名称 如果操作系统是自定义的 则默认包名称将由设备制造商更改 如何通过编码获取包名 我不确定这是否可能 你尝试过这个吗 PackageManager packman getPackag
  • 将绘图打印/保存为 png 文件,并在 Octave 中出现 alpha 通道问题

    如何将绘图打印 保存为带有 Alpha 通道的 png 文件 I tried 在具有透明背景的 Octave 中保存绘图 我正在使用 Octave 4 2 2 Ubuntu 18 04 64 位和graphics toolkit fltk
  • 通过 python-ldap 使用 Active Directory 中的 unicode 编码字符串

    我已经提出了这个问题 但经过一些测试后 我决定创建一个包含一些更具体信息的新问题 我正在使用 python ldap 和 Python 2 7 从我们的 Active Directory 读取用户帐户 这确实有效 但我对特殊字符有问题 当打
  • 将图像保存到媒体库 WP7

    我无法将图像保存到 Windows Phone 媒体库中 这是我的代码片段 public void SaveImageTo string fileName fileName jpg var myStore IsolatedStorageFi
  • Firestore 中可以使用多少个集合文档对?

    我有一个具有以下架构的应用程序 HOME gt Collection gt Document gt Collection gt Document 和代码 db collection coll doc doc collection subco
  • 元更改事件未触发

    我有一家商店 看起来像这样 Ext define GridGeneral store GridGeneralStore extend Ext data Store model GridGeneral model GridGeneralMod
  • 获取其他收件箱的参考

    我正在使用 Outlook 2007 并且有我的主邮箱 Tait Mark 我还在我的个人资料中添加了另一个邮箱 采购 请求 两者都显示为 Outlook 中的顶级文件夹 邮箱 泰特 马克 gt 对话历史记录 删除的项目 草稿 收件箱 垃圾
  • 在 WCF 中处理图像

    我有一个桌面应用程序 需要通过 TCP 协议向服务计算机上传 下载图像 起初 我将图像存储在文件系统中 但我需要在 MS SQL DB 中比较哪种解决方案更好 图片数量超过五十万 我还不知道照片尺寸是否有限制 如果您曾经这样做过 请写下您对
  • 在 JavaScript 中更改另一个函数中的变量

    我对 JavaScript 还很陌生 并且对变量和函数的一些属性遇到了麻烦 我想要发生的是有一个var在一个函数中定义 在另一个函数中更改值 然后将新值返回到最初定义它的函数 这是我制作的一个简单示例 function getIt var
  • 文本排序顺序的 MIN/MAX

    在 SQL Server 中 MIN 和 MAX 可以作用于不计算为数字的文本 返回具有最低或最高文本排序顺序的文本项 或者如 SQL Server 中所说的 排序顺序 是否可以在 Excel 中执行此操作 而无需使用实际排序的 UDF 例
  • malloc 和 calloc 与 std::string 之间的区别

    我最近开始接触 C 并且在使用 malloc 时遇到了问题 下面的代码不会打印出 成功 程序崩溃 退出代码为 0xC0000005 而如果我使用 calloc 则一切正常 int main std string pointer std st
  • 为什么使用 boost::multi precision::cpp_int 会影响这里的尾调用优化

    我有一些模板化代码 编译器可以对大多数数据类型进行尾部调用优化 但不能对其他数据类型进行尾部调用优化 代码实现了pow template