与字节顺序无关的读取的首选习惯用法

2023-11-23

在 Plan 9 源代码中,我经常找到这样的代码,用于从具有明确定义的字节顺序的缓冲区中读取序列化数据:

#include <stdint.h>

uint32_t le32read(uint8_t buf[static 4]) {
    return (buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24);
}

我希望 gcc 和 clang 都能将此代码编译成与 amd64 上的程序集一样简单的代码:

    .global le32read
    .type le32read,@function
le32read:
    mov (%rdi),%eax
    ret
    .size le32read,.-le32read

但与我的预期相反,gcc 和 clang 都没有识别这种模式,而是产生具有多个班次的复杂汇编。

对于这种操作是否有一种习惯用法,既可以移植到所有 C99 实现,又可以跨实现生成良好的(即像上面介绍的那样)代码?


经过一些研究,我发现(在 Freenode 上的 ##c 中的出色人员的帮助下),gcc 5.0 将为上述类型的模式实现优化。事实上,它将我的问题中列出的 C 源代码编译为下面列出的确切程序集。

I haven't found similar information about clang, so I filed a bug report. As of Clang 9.0, clang recognises both the read as well as the write idiom and turns it into fast code.

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

与字节顺序无关的读取的首选习惯用法 的相关文章

  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 如何在发送到服务器之前在 JavaScript 中压缩/gzip 用户数据?

    我对 JavaScript 还很陌生 我遇到过这样的情况 许多用户可以将大型 JSON 发送回服务器 为了限制流量 我想对它们进行 gzip 压缩 这在 JavaScript 中可能吗 如何从 JSON 的字符串表示形式创建字节数组 谢谢
  • Delphi:远离 VSS

    我们是由少数 Delphi 开发人员组成的团队 他们多年来一直在使用 VSS 我知道这很遗憾 但我们没有使用 VCS 的任何高级功能 因此它在很多情况下都工作正常 但有时它是快把我逼疯 VSS 的好处是我们使用第三方插件将 VSS 与 De
  • 使用 Oracle OLE DB 提供程序时如何解决 SQL 查询参数映射问题?

    当尝试使用 Oracle OLE DB 提供程序输入带参数的 SQL 查询时 出现以下错误 无法从 SQL 命令中提取参数 提供程序可能无法帮助解析命令中的参数信息 在这种情况下 请使用 来自变量的 SQL 命令 访问模式 其中整个 SQL
  • 在 OpenShift 中提供 Django 静态文件

    根据2014 年 3 月博客文章 OpenShift 现在删除了一些目录 如 wsgi wsgi static data 和 libs 鉴于我使用 wsgi static 来实现此目的 从现在开始我应该如何提供 django 静态文件 根据
  • 想要使用向量作为函数的参数,而不必分隔其元素

    如果我使用以下命令调用 matlab 函数 函数 1 2 3 4 5 它工作得很好 但如果我这样做 a 1 2 3 4 5 a 1 2 3 4 5 给出相同的结果 then func a 给我 错误 gt 函数位于 11 没有足够的输入参数
  • 使用 Java Native Interface 的缺点

    我无法理解使用 JNI 的这两个缺点 我想更多地了解他们 很难调试运行时错误 本机代码 JNI 代码中的错误会导致整个 JVM 崩溃 并且不提供任何正常恢复机制 调试困难 您需要一个 C C 调试器来调试本机代码 不可能轻松地从 Java
  • 加载 GIF(预加载器)仅在 Chrome 上卡住

    我的网站上有一个画廊 该图库包含 15 张图片 每张约 500KB 总大小为 7 5MB 因为图库需要一段时间才能加载 在我的计算机上需要 25 秒 这取决于连接情况 我希望访问者知道图库正在加载 因此Ajax 加载 GIF 我希望访问者一
  • 按相关实体字段对 Sonata Admin 中的列表视图进行排序

    使用 Sonata Admin Bundle 这是 Symfony 的一个很棒的附加组件 时 我遇到了如下所述的问题 假设我们有 3 个实体 城市 州和国家 他们都有属性id and name 城市与州之间存在多对一的关系 州与国家之间存在
  • 使用数值对字符串列表进行排序

    我有一个字符串列表 它最有可能但不能保证包含数字列表 即 1 6 2 21 89 有什么方法可以对字符串列表进行排序 使其始终按升序显示 在进行排序之前 我无法先将字符串解析为数字 因为字符串can包含非数字字符 我不想遍历列表并将每个组件
  • Debezium:数据库中没有记录最大LSN;请确保 SQL Server 代理正在运行

    这个问题与 Debezium 如何使用 Kafka Connect 正确注册 SqlServer 连接器 连接被拒绝 在 Windows 10 中 我在 Docker 容器外部的 Microsoft SQL Server 实例上运行 Deb
  • CSS - 元素的“反向”浮动 - 如何将它们保持在底部?

    我目前面临一个有趣的 CSS 问题 我在网络上找不到任何相关内容 我知道这一定是可以解决的 也许你们能解决这个问题 以下问题 我需要在位于左下角的图像前面显示一些图标 由于图标的数量可能会有所不同 因此图标会彼此相邻浮动 每行最多三个 由宽
  • JavaScript 内存分析器

    我正在寻找一个好的 JavaScript 内存分析器 特别是针对 IE 的 任何有关如何查找 javascript 内存泄漏的建议也将受到赞赏 您正在寻找sIEve 就是这样 有一段时间 主要的答案是 Drip 但 sIEve 是同一个人的
  • Elastic Beanstalk Nginx 提供静态文件

    我是 Elastic Beanstalk 的新手 尝试提供 Node js Express 应用程序并利用 Nginx 单独提供静态文件 我遇到的教程都没有明确说明如何定义虚拟路径 我尝试通过浏览器中的 AWS 控制台执行此操作 我正在尝试
  • 使用实体框架删除大量项目[重复]

    这个问题在这里已经有答案了 我想用EF删除一大堆项目 所以我尝试将它们一一删除 但需要很长时间 我尝试使用 RemoveAll 方法与我的列表 但它不更新数据库 仅从加载的实体中删除 所以我用一个SqlCommand将它们从数据库中删除 我
  • 用Java做一个简单的定时器

    我似乎不知道如何用java制作一个简单的计时器 我需要它做的只是显示时间 真的 所以只是一个开始方法 它会不断地计数 如 0 00 0 01 0 02 等 我见过一些其他类似的论坛帖子 但所有代码对于我的水平来说有点复杂理解 我对java有
  • C++ 中如何使用 while 循环读取文件?

    为什么可以使用 while 循环读取文件 例如 while file gt gt variable Or while getline xx yy Do the gt gt and getline函数返回布尔值 流运算符评估为对流本身的引用
  • 拥有一个没有抽象方法的抽象类有什么意义?

    可以有一个抽象类实现其所有方法 其中没有抽象方法 Eg public abstract class someClass int a public someClass int a this a a public void m1 do some
  • 在类中调用父类的 __call__ 方法

    我想给家长打电话call来自继承类的方法 代码看起来像这样 usr bin env python class Parent object def call self name print hello world name class Per
  • 将安全字符串转换为纯文本

    我正在 PowerShell 中工作 并且我有代码可以成功将用户输入的密码转换为纯文本 SecurePassword Read Host AsSecureString Enter password convertfrom securestr
  • 与字节顺序无关的读取的首选习惯用法

    在 Plan 9 源代码中 我经常找到这样的代码 用于从具有明确定义的字节顺序的缓冲区中读取序列化数据 include