编译时检查右移是否是有符号类型的算术运算

2024-02-20

我想知道在对有符号类型进行操作时检查右移是否是算术的最便携的方法是什么(例如是否-2 >> 1 is -1) 在编译时。

我的想法是在编译时以某种方式检查这一点并能够检测到这一点,这样我就可以编译该函数的不同版本(取决于运算符是否>>是否真的是算术移位)。

通过阅读主题验证 C / C++ 有符号右移对于特定编译器来说是算术吗? https://stackoverflow.com/questions/1597704/verifying-that-c-c-signed-right-shift-is-arithmetic-for-a-particular-compiler我想到了初始化一个标志

static const bool is_arithmetic_rs = (((signed int)-1)>>1) == ((signed int)-1));

并在运行时测试它,如下所示:

if (is_arithmetic_rs) {
  // some fast algorithm using arithmetic right shifts (using >> operator)
} else {
  // the same algorithm without arithmetic right shifts (much slower)
}

但是,如果可能的话,我希望每次都避免这种分支。为了简单起见,假设我想实现一个可移植的算术右移;如果每次调用函数时都必须检查这一点,这将对性能产生巨大影响,因此如果可能的话,我想在编译时执行此操作。

如果不存在执行此检查的可移植方法,是否有一种方法可以通过尽最大努力进行检查来执行此操作,例如使用 ifdefs 检查特定编译器/平台?


执行此类检查的最佳方法是例如GNU 自动工具 http://en.wikipedia.org/wiki/GNU_build_system do:

  • 在目标平台上编译一个小程序并测试会发生什么

  • 设置一个合适的#define在头文件中

  • 将该头文件包含在源文件中

  • (可选)使用适当定义的宏,这样您的代码就不会混乱#ifdef每件小事的指示。

  • 编译你的主项目

这样,您就不必创建具有支持的功能以及每个硬件平台和操作系统的各种怪癖的表 - 更不用说它们的组合了。但是,如果您没有在目标上构建代码,那么您will必须用针对您的目标预先提供的功能表/列表来替换第一步。

您可能应该看看广泛使用的构建系统,例如 GNU autotools 或CMake http://www.cmake.org/,以便重用现有的宏和特定于平台的信息,并避免必须创建自己的宏和重新发明轮子。

顺便说一句,现在任何像样的编译器都应该优化带有常量表达式的简单测试,因此在必要时使用运行时测试(也许通过宏)不会对性能造成太大影响。您应该测试并分析您的代码以找出答案。

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

编译时检查右移是否是有符号类型的算术运算 的相关文章

随机推荐

  • 如何在 ASP.NET Core 中返回 401 而不是 302?

    我试图让 ASP NET Core Identity 在用户未登录时返回 401 我添加了一个 Authorize 属性到我的方法 而不是返回 401 而是返回 302 我尝试了很多建议 但似乎没有任何效果 包括services Confi
  • 从 JComboBox 渲染器获取工具提示

    我有一个扩展 JPanel 的 ComboBox 渲染器并有两个标签 在这里 我需要在鼠标移至时显示工具提示图标标签仅有的 如果鼠标在标签项不应显示工具提示 import java awt Color import java awt Com
  • asyncio matplotlib show() 仍然冻结程序

    我希望运行模拟当在同时在绘图中输出其进度 我一直在研究很多线程和多重处理的示例 但它们都非常复杂 所以我想用Python的新asyncio图书馆这应该更容易 我找到了一个例子 如何在异步函数中使用 yield https stackover
  • 如何根据书籍的条形码编号查找有关书籍的数据? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在构建世界上最简单的图书馆应用程序 我想要做的就是使用典型的扫描仪 只需将条形码的数字输入到字段中
  • Python 请求:POST 请求删除授权标头

    我正在尝试使用 Python requests 库发出 API POST 请求 我正在经过一个Authorizationheader 但是当我尝试调试时 我可以看到 header 被删除 我不知道发生了什么事 这是我的代码 access t
  • Android setOnclicklistener 参数

    我是android的初学者 在为按钮设置onclick监听器时 传递的参数是什么意思 btn1 setOnClickListener new OnClickListener Override public void onClick View
  • MySQL php 表的线性插值

    I have a table titled psytable moist air shown below 我正在尝试开发一个 MySQL 语句 该语句将在记录之间插入一个值 编辑 如果用 PHP 进行数学计算更容易 我也愿意接受该解决方案
  • 从图像中提取线条以输入 OCR - Tesseract

    我在 pycon 上看这个演讲http youtu be B1d9dpqBDVA t 15m34s http youtu be B1d9dpqBDVA t 15m34s15 33 左右 演讲者谈到从图像 收据 中提取线条 然后将其输入 OC
  • Mongodb计算查询--累加乘法

    我最近开始在 Mongodb 中从事 POC 工作 我下面有一个 json 集合 db ccpsample insertMany ccp id 1 period 601 sales 100 00 ccp id 1 period 602 gr
  • 无需凭据仍可访问 MongoDB 服务器

    我的机器中有一个新的 mongodb 服务器 2 6 0 我使用以下配置文件启动了 mongod 实例 dbpath c mongo data db port 27017 logpath c mongo data logs mongo lo
  • 导航到带有附加标头的 URL

    无论如何我们可以导航 通过 a a 单击 到请求中带有附加标头的 URL 这是我的代码 我有一个 a href a 标签 然后我处理onClick 通过 JQuery 的事件 aUsers click function var spAuth
  • 如何有效地将纬度/经度地理编码反转为行政区

    我正在处理纽约市出租车数据集 该数据集的列包括日期时间 接送纬度 经度 下车纬度 经度等 现在我想对纬度 经度进行反向地理编码以找到行政区 社区 我碰到geopy并发现这样的事情完美地工作 from geopy geocoders impo
  • C++ 内联函数的定义必须在同一个文件中吗?

    我定义了一个函数show 如内联在名为的头文件中ex h以及里面函数的定义ex cpp 我预计这会给我一个错误 因为编译器不知道在哪里替换什么show 函数被调用 但因为我使用的是 IDE 所以它工作得很好 怎么会发生这种事 顺便说一句 当
  • 如何使用Java上传图像Url上传到Fire Storage并同时将其保存在fireStore中

    这是我的代码 我可以在 Toast 消息中检索图像 Url 但无法将其保存在 firestore 中 请告诉我是否有其他方法可以做到这一点 或者是我存储 URL 的问题 public class register extends AppCo
  • 空手道加特林:如何模拟空手道功能,除了那些标有@ignore的场景

    我有一个功能可以定义加特林测试的工作流程 加特林测试正在运行 但如何设置空手道选项来忽略标记为 ignore 使用系统属性 例如 Dkarate options tags ignore 没有帮助 mvn clean test compile
  • Unity - 将脚本文件移动到其他目录而不会丢失引用

    由于可以从另一个脚本访问 我必须将 GameManager Script 移动到更高的目录 但是 如果我尝试将脚本从一个文件夹移动到另一个目录 所有引用都会消失 我的意思是 所有脚本的所有引用 从头开始重新配置所有脚本确实很困难 就像从头开
  • 如何在 C# 窗口应用程序中以编程方式创建按钮?

    在 Form1 Load 方法中 我应该编写什么代码来创建一个简单的按钮 private void Form1 Load object sender System EventArgs e 这样在 加载 时就会显示按钮 正如你所说 它是Win
  • SAS中是否有相当于R函数表的?

    在 R 中 函数table使用交叉分类因素构建列联表 是否有一个等效的 SAS PROC 可以重现此 R 函数的结果 Example x lt data frame x rep 1 2 times 5 y rep 1 2 each 5 ou
  • 可以将 FileOutputStream 转换为字节数组吗?

    我想将 FileOutputStream 转换为字节数组 以便在两个应用程序之间传递二进制数据 请问有人可以帮忙吗 要将文件转换为字节数组 请使用 ByteArrayOutputStream 类 此类实现一个输出流 其中数据写入字节数组 当
  • 编译时检查右移是否是有符号类型的算术运算

    我想知道在对有符号类型进行操作时检查右移是否是算术的最便携的方法是什么 例如是否 2 gt gt 1 is 1 在编译时 我的想法是在编译时以某种方式检查这一点并能够检测到这一点 这样我就可以编译该函数的不同版本 取决于运算符是否 gt g