如何判断 `constexpr` 是否在编译时求值(无需手动检查)

2023-12-12

有没有一种标准方法可以找出编译器做了什么constexpr功能?

(旁注:对于调试,默认情况下每个 constexpr 函数都会推迟到运行时。为什么这是明智的?有没有办法影响这一点?)

对于发布取决于上下文。显然,对于小型测试设置,您可以轻松检查生成的机器代码,但这不是实际项目的方法。

我当前的“解决方法”(VC++)是在某个地方中断,转到我的 constexpr 函数并(尝试)检查反汇编。如果没有,我的结论是这一切都是在编译时完成的。 但这种方式并不是100%可靠。 (优化等) 只有相反的方式是确定的:如果我确实找到反汇编(甚至可以在那里中断),我知道它不是在编译时完成的。


不可能。 constexpr不保证值内联,您可以在此处查看此操作优化级别:https://godbolt.org/z/dAoiM-

仅从 -O2 开始,所有内容都被内联并且结构被溶解。下面,编译器愉快地使用运行时评估,即使对于使用的代码constexpr语境。

没有标准语言工具可以查询编译器是否应用特定的优化。这一切都归结为假设规则。如果代码的行为相同,编译器可以对其执行任何操作。唯一的例外是强制性 RVO 和其他 RVO(允许它们改变观察到的行为。)

话虽如此。这constexpr是一个有用的提示。在链接的示例中,如果删除constexpr说明符甚至O3(在最近的 clang 和 gcc 上)无法删除地图。

从优化角度来说,编写是值得的constexpr函数和数据结构,确保编译器可以优化,尽管你不能强迫它这样做。

您可以强制对函数进行评估constexpr上下文,您还可以保护要抛出的非 constexpr 路径,以防止有保证的运行时评估。

#include <iostream>
#include <vector>
using namespace std;

constexpr int f(int el) {
    return el > 0 ? el : throw "error";
}

int main() {
    // constexpr auto r = f(-1); // #1 compiler errors that throw is forbidden in  
                                 // constexpr, so it went into a non-constexpr path
                                 // and failed

    constexpr auto r = f(1);     // #2 fine - has to be interpreted in constexpr context
    cout << f(1) << '\n';        // #3 fine - can be interpreted in both contexts

    try {
        cout << f(-1) << '\n'; // # 4 // throws - i.e. runtime evaluation
    }
    catch (const char* e) {
        cout << e << '\n';
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何判断 `constexpr` 是否在编译时求值(无需手动检查) 的相关文章

  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 更快的算法来计算有多少数字可以被范围内的特定整数整除

    int a b c d 0 cin gt gt a gt gt b gt gt c for int i a i lt b i if i c 0 d cout lt
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E

随机推荐

  • Python:找不到 os.listdir 文件[重复]

    这个问题在这里已经有答案了 我最近将配置文件移动到项目中的另一个文件夹 我尝试像这样加载 CONFIG PATH os path abspath os path dirname os path abspath file config def
  • for循环后全局变量的值不会改变

    我正在开发一个hadoop项目 我想找到某一天的客户 然后写出当天消费最多的客户 在我的减速器类中 由于某种原因 全局变量maxfor 循环后不会改变它的值 EDIT我想找到某一天消费最多的顾客 我已经设法在我想要的日期找到客户 但我在减速
  • 如何将第 3 方 JAR 添加到 jGRASP 中的编译时类路径?

    我需要做什么才能成功导入ij包裹 我收到错误 ITCN java 1 package ij does not exist 进口产品为 import ij import ij io import ij gui import ij proces
  • Service Worker 将 API 调用中的文件添加到预缓存中

    使我的应用程序能够离线运行 在安装过程中 服务人员应该 从异步 API 获取 URL 列表 重新格式化响应 将响应中的所有 URL 添加到预缓存 对于此任务 我将 Google Workbox 与 Webpack 结合使用 问题 虽然服务工
  • 查找并计算网络中隔离和半隔离节点的数量

    我正在与经历了许多的网络合作扰乱事件 因此 许多节点会因给定事件而发生故障 因此 左侧图像与右侧图像之间存在过渡 我的问题 我怎样才能找到不连通的子图 即使它们只包含 1 个节点 我的目的是count他们并渲染失败了 因为在我的研究中 这适
  • 在 Gitahead 中的 origin 上也创建标签

    当我在本地存储库上创建标签时 它是在我的本地存储库上创建的 我不知道如何推送位于 GitHub 上的源 我可以通过命令行将其推送到远程存储库 git push origin v0 3 0 但我想知道是否有办法通过 Gitahead 的 GU
  • 使用单个副本时,Kubernetes 部署不执行滚动更新

    我修改了部署配置 生产 yaml 更改了容器映像值 然后我运行了这个 kubectl replace f production yaml 发生这种情况时 我的服务似乎没有响应 此外 kubectl get pods wordpress 21
  • Pyinstaller 未加载 DLL

    为我的 python 脚本构建 exe 后dungeon py 我收到错误时PyBearLibTerminal py 我的程序导入的脚本 尝试加载 DLLBearLibTerminal dll 该脚本运行正常 只是运行导致错误的可执行文件
  • Google 地图 - 平移和缩放区域 - 放大或平移时标记不出现

    我正在标记的服务器端实现一些基于边界的集群 以显示在我的谷歌地图上 我正在做的是 我有一个函数 每次移动 平移或缩放地图时都会调用该函数 该函数获取地图的边界并进行 ajax 调用 服务器端脚本又运行一个简单的 sql 查询来检索标记并对它
  • Android:自动选择调试/发布 Maps v2 api 密钥?

    我在我的项目中使用 Google Maps v2 API 在 Google 地图 v2 中 调试 发布 API 密钥定义在AndroidManifest xml 我见过the link但地图键是在 xml 布局文件中定义的 而不是在Andr
  • 自签名小程序可以访问本地文件系统吗

    您好 我已经创建了一个自签名小程序 但无法访问本地文件系统 我该怎么办 你需要将你的IO代码包装在里面特权动作 通常 您需要使用测试证书对小程序进行签名 用户将看到警告 并且在加载小程序时必须接受证书 那么您需要将代码包装在 Privili
  • Python:binned_statistic_2d 均值计算忽略数据中的 NaN

    我在用scipy stats binned statistic 2d通过查找每个箱内点的平均值 将不规则数据分箱到统一网格上 x y np meshgrid sort np random uniform 0 1 100 sort np ra
  • src绝对路径问题

    我有一个图像C wamp www site img我尝试将其显示在页面中 img src 但它不起作用 该文件实际上在那里 如果我尝试使用相对路径引用它 我就会得到图片 img src img mypicture jpg 错误在哪里 我错过
  • 在 Windows 中从命令行运行 python 脚本

    我正在尝试跑步蛇食 分析一个Python项目 我使用的是 Windows 机器 到目前为止我已经能够弄清楚如何 安装 Tortoise for Mercurial 以从站点下载 SnakeFood 代码 设置 Windows 路径以从命令提
  • Jquery 自动完成底部附加链接

    I am using jQuery auto complete plugin in my web project I want to show 3 element and after that i want to append see al
  • 如何通过重新定义的 ListBox 模板使用 UI 虚拟化

    我正在尝试使用 ListBox 作为包含多个项目的视图 当然 我需要在其中使用 UI 虚拟化 问题是虚拟化仅在我以这种方式声明 ListBox 时才起作用
  • 如何以编程方式获取下一个预定的触发时间?

    我制作了一个新的可安装触发器 该触发器每 2 天以编程方式为我的电子表格触发一次 那么当我返回到电子表格时 我可以得到下次触发函数的时间吗 或者甚至它触发的频率是多少 我所看到的是我可以获得它的类型 它触发的函数 唯一ID等等 Thanks
  • 如何删除具有任何零值的行

    我有一个问题需要解决如何删除 R 中具有零值的行 另一方面 我可以使用na omit 删除所有 NA 值或使用complete cases 删除包含 NA 值的行 有谁知道如何删除 R 中具有零值的行 例如 Before DateTime
  • 正则表达式匹配多个组

    我有以下带有正则表达式的字符串示例 我试图匹配它 Regex d 3 0 9a fA F 2 3 要匹配的字符串 010 00 00 00 我的问题是这样的 正则表达式匹配并捕获 1 组 最终00在字符串的末尾 但是 我希望它能够匹配所有三
  • 如何判断 `constexpr` 是否在编译时求值(无需手动检查)

    有没有一种标准方法可以找出编译器做了什么constexpr功能 旁注 对于调试 默认情况下每个 constexpr 函数都会推迟到运行时 为什么这是明智的 有没有办法影响这一点 对于发布取决于上下文 显然 对于小型测试设置 您可以轻松检查生