如何通过内联函数强制 const 传播?

2023-12-04

我试图强制预处理器为我执行一些数学运算,以便将常量传播到内联汇编中。这是简化的情况:

inline
unsigned int RotateRight(unsigned char value, unsigned int amount)
{
    COMPILE_ASSERT(((unsigned char)(amount%32)) < 32);
    __asm__ ("rorb %1, %0" : "+mq" (value) : "I" ((unsigned char)(amount%32)));
    return value;
}

上面的代码依赖于 CPU 特定的功能,我对此很满意(实际上,当 GCC 可用时,它是 x86/x64 Linux 上的模板专门化)。这"I"约束表示积分值必须介于[0,31]包括的。

代码的调用者看起来像:

byte b1 = RotateRight(1, 1);
byte b2 = RotateRight(1, 31);

A RotateRight(1, 31)来自密码学家(它在 C/C++ 中的未定义行为,因为字节只能在范围内旋转[0,7])。我可以使用 ASM 摆脱 C/C++ 的限制。由于移位量在编译时已知,因此我希望在编译时减少它;我想要rorb使用immediate-8生成的版本。

如果没有COMPILE_ASSERT,代码可以编译,但我不确定该常量是否正在传播。也就是说,它可能会以意外减少的方式生成(% 32)。随着COMPILE_ASSERT,代码无法编译。

$ make validat1.o
g++ -DNDEBUG -g2 -O3 -march=native -pipe -c validat1.cpp
In file included from simple.h:10:0,
                 from filters.h:6,
                 from files.h:5,
                 from validat1.cpp:6:
misc.h: In function ‘T CryptoPP::rotlFixed(T, unsigned int) [with T = unsigned char]’:
misc.h:940:43: error: ‘y’ cannot appear in a constant-expression
  CRYPTOPP_COMPILE_ASSERT(((unsigned char)(y%32)) < 32);
                                           ^
misc.h:72:85: note: in definition of macro ‘CRYPTOPP_COMPILE_ASSERT_INSTANCE’
 _COMPILE_ASSERT_INSTANCE(assertion, instance) static CompileAssert<(assertion)>

我知道我不应该使用#define,而 C++ 内联函数就是答案。但我觉得我正在遭受脱节。

如何强制编译器传播涉及的值const values?

或者,如果COMPILE_ASSERT是错误的工具(const正在传播),我如何设置一个测试,以便我可以验证即时 8 版本rorb用来?


相关的是,这是一个C++03项目。它不使用Boost,不使用Cmake,不使用Autotools等。


当您指定amount作为函数参数,您会失去其编译时常量。

你为什么不声明amount是模板参数吗?在这种情况下,函数用户还被迫传递编译时常量,这也很好。

为了确保将shift用作编译时常量,您可以创建一个static const局部变量。

template<unsigned int amount> inline
unsigned int RotateRight(unsigned char value)
{
    static const unsigned char shift = (unsigned char)(amount%32);
    __asm__ ("rorb %1, %0" : "+mq" (value) : "I" (shift));
    return value;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过内联函数强制 const 传播? 的相关文章

随机推荐

  • PHP登录后重定向回来

    我有一个这样的场景 当管理员收到客户发来的有关订单的邮件时 其中包含 PHP 表单页面的 URL 链接 该页面只能通过管理员登录来访问 如果管理员未登录 则 url 将重定向至登录页面 管理员成功登录后 我需要将他重定向到他在电子邮件中收到
  • 如何使用react-router重定向到另一个路由?

    我正在尝试使用反应路由器做一件简单的事情 版本 1 0 3 重定向到另一个视图 import React from react import Router Route Link RouteHandler from react router
  • 使用php对程序进行交互控制

    我想使用 php 在远程计算机上运行 C 程序 最终目标是使用手机或任何其他计算机上的网络浏览器来控制程序 我的 C 程序在几十分钟内从不同的传感器获取数据 它在 Linux 中从命令行运行 我可以通过按计算机键盘上的 q 键将其关闭 主线
  • 为什么对 DOM 元素执行 Array.prototype.slice.call(nodeList) ?

    许多 JavaScript 库 jQuery Zepto 似乎都在 querySelectorAll getElementsByTag 或 ClassName 结果上调用 Array prototype slice call 通过在 Sta
  • Heroku推送被拒绝,无法编译Python/django应用程序(Python 2.7)

    我正在做 Heroku 演练 https devcenter heroku com articles django preventions对于 python 开发人员 我在尝试运行 git push heroku master 时遇到错误
  • 在 R 中使用 stat_function 在对数刻度上绘图

    我在尝试清醒头脑时遇到了严重的问题stat function in R s ggplot2 我从这个简单的例子开始 ggplot data frame x c 1 1e4 aes x stat function fun function x
  • 如何使用 Python (2.7) 读取 Windows 通知?

    有没有办法使用Python读取Windows系统通知 屏幕右下角的气泡对话框 我试图阅读通知的文本及其生成时间 但我未能成功找到有关如何执行此操作的任何信息 我找到了一些关于如何generate这些通知 例如这个问题 如何用python创建
  • 如何从源代码为 CMake 构建 .deb 文件?

    如何从 CMake 源代码生成 ubuntu 的 deb 文件 我已经使用 apt 安装了 希望是大部分 构建依赖项 sudo apt get build dep cmake 使用 git 查看 cmake 存储库 git clone ht
  • 创建有角度的 CSS3 分隔线 - 100% / 自动高度

    我检查了这两个帖子 相邻的 div 带有倾斜的边框 复制 and 具有斜边的形状 响应式 但发布的这些解决方案不会调整为容器的 100 高度 我需要这个 我找不到适合我的场景的解决方案 我正在尝试复制这种行为 区别在于该容器内的文本可以是任
  • “com.gorylenko.GenerateGitPropertiesTask”属性“gitProperties”缺少输入或输出注释?

    我面临以下错误 我不知道哪个插件导致了这个 我在用Java 11和Gradle 7 4 1 wrapper 发现任务配置有些问题 myservice server generateGitProperties 类型 生成GitProperti
  • 如何使用jquery-ui在另一个框架中弹出对话框

    我正在使用 jquery ui 1 8 创建一个小网页 它有一个框架集和三个框架 然后我在 test php 文件中添加了一个按钮 该文件在第一帧 f1 加载 并在 test2 php 文件中添加了一个 div 该文件在第二帧加载 div
  • glDeleteBuffers 比 glBufferData 慢

    我的 iOS Android 游戏遇到一些性能问题 其中几个 VBO 必须每隔一段时间更新一次 对我的游戏进行分析后发现 glDeleteBuffers 每次 VBO 更新最多需要 7 毫秒 当帧通常只需要 4 毫秒渲染时 这当然会导致出现
  • Java 7 中的 JEditorPane 换行

    首先 我希望这不是我开始新话题的问题 老实说 我不知道如何根据已经回答的问题提出问题 所以我做了这个 我对 Java 还很陌生 我的问题如下 我正在编写一个小聊天程序 并且正在使用JEditorPane与HTMLEditorKit以不同颜色
  • 渲染网站(包括 javascript)的 shell 工具

    我们想在 Linux shell 上测试我们的网页 出于这个原因 我正在寻找一个 shell 工具 它从服务器获取 html 页面 如 wget 然后执行包含的 Javascript 包括图片等 之后 该工具应该为我提供渲染页面的 屏幕截图
  • 由于捕获的异常而显示 WinRT MessageDialog 的正确方法是什么?

    由于捕获的异常而显示消息对话框的正确方法是什么 我最初尝试过 try await DoSomething catch InvalidOperation ex await MessageDialog ex Message ShowAsync
  • T-SQL:根据 MA​​X 选择列(其他列)

    我希望有一种简单的方法可以在不使用子查询的情况下执行此操作 场景 您有 TableA 其中包含 Key SubKey 和 Value 列 我需要获取给定 Key 的 MAX SubKey 的 Value 因此 如果表包含以下行 KEY SU
  • 如何配置 IIS 以将 ISAPI DLL 映射到域根目录

    我在以下目录下安装了 ISAPI DLL c inetpub wwwroot emsserver emsserver dll 这是一个 Delphi RAD 服务器应用程序 在 IIS 管理器 Windows 10 中 在根 计算机名称 g
  • 父对象构造期间不受限制的联合成员生命周期

    通常 您对不受限制的工会成员的生命周期负责 通常您通过就地 ctor dtor 调用来完成 但是 显然 至少在一种情况下 编译器可以帮助您 在下面的代码中 如果对象构造失败 它 之前构造的 联合成员将被自动销毁 至少在 MSVC 2015
  • 使用 Google SpreadSheet API 更新 iOS Swift 中的特定行

    我一直在 iOS swift 中研究 Google SpreadSheet API 但是在 iOS Swift 中更新 SpreadSheet 行 数据中的特定字段时存在问题 以下是在电子表格顶部添加一行的代码 但我想要特定索引或匹配特定值
  • 如何通过内联函数强制 const 传播?

    我试图强制预处理器为我执行一些数学运算 以便将常量传播到内联汇编中 这是简化的情况 inline unsigned int RotateRight unsigned char value unsigned int amount COMPIL