检测目标 CPU 上的对齐内存要求

2024-02-14

我目前正在尝试构建一个可以在多种机器上运行的代码,从手持口袋和传感器到数据中心的大型服务器。

这些架构之间的(许多)差异之一是对齐内存访问的要求。

“标准”x86 CPU 不需要对齐内存访问,但许多其他 CPU 需要它,如果不遵守规则,就会产生异常。

到目前为止,我一直在通过使用 Packed 属性(或 pragma)强制编译器对已知有风险的特定数据访问保持谨慎来处理它。而且效果很好。

问题是,编译器非常谨慎,以至于在此过程中损失了大量性能。

由于性能很重要,因此我们最好重写部分代码以专门在严格对齐的 cpu 上工作。另一方面,这样的代码在支持未对齐内存访问的 cpu(例如 x86)上会变慢,因此我们想使用它only在需要严格对齐内存访问的CPU上。

现在的问题是: 如何在编译时检测目标体系结构需要严格对齐的内存访问? (或者反过来)


据我所知,没有任何 C 实现提供任何预处理器宏来帮助您解决这个问题。由于您的代码应该可以在各种机器上运行,因此我假设您可以访问各种机器进行测试,因此您可以通过测试程序找出答案。然后你可以编写自己的宏,如下所示:

#if defined(__sparc__)
/* Unaligned access will crash your app on a SPARC */
#define ALIGN_ACCESS 1
#elif defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC)
/* Unaligned access is too slow on a PowerPC (maybe?) */
#define ALIGN_ACCESS 1
#elif defined(__i386__) || defined(__x86_64__) || \
      defined(_M_IX86) || defined(_M_X64)
/* x86 / x64 are fairly forgiving */
#define ALIGN_ACCESS 0
#else
#warning "Unsupported architecture"
#define ALIGN_ACCESS 1
#endif

请注意,未对齐访问的速度取决于它跨越的边界。例如,如果访问跨越 4k 页边界,则速度会慢很多,并且可能存在其他边界导致速度更慢。即使在 x86 上,一些未对齐的访问也不会由处理器处理,而是由操作系统内核处理。那是慢得令人难以置信。

也不能保证未来(或当前)的实现不会突然改变未对齐访问的性能特征。这已经发生了过去发生的和将来可能发生的; PowerPC 601 非常宽容未对齐的访问,但 PowerPC 603e 则不然。

使事情变得更加复杂的是,您编写的用于进行未对齐访问的代码在跨平台的实现上会有所不同。例如,在 PowerPC 上,它被简化为:x << 32 and x >> 32总是 0 如果x是 32 位的,但是在 x86 上你就没有这样的运气了。

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

检测目标 CPU 上的对齐内存要求 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 应用非限定名称查找而不是依赖于参数的名称查找

    考虑标准 sec 3 4 1 3 中的一个示例 typedef int f namespace N struct A friend void f A operator int void g A a int i f a f is the ty

随机推荐

  • 在 Cassandra 中存储上次触摸时间的最佳方式

    我将最后一次触摸的时间存储在 Postgres 的 User 表中 但是有许多频繁的更新和足够的争用 我可以看到 3 个相同更新死锁的示例 Cassandra 似乎更适合这个目的 但我应该专门用一个表来实现这个目的吗 我不需要旧的时间戳 只
  • Java 编译器会预先计算文字的总和吗?

    int i 10 20 编译器是否真的会处理这段代码 添加10 20 并且字节码与这行代码相同 int i 30 我在哪里可以读到相关内容 是的 您甚至可以亲自验证 以一个小的 Java 文件为例 public class Main pub
  • 如何从 jenkins Powershell 脚本更新环境变量

    您好尝试从阶段编写的 Powershell 脚本更新 jenkins Env 变量 pipeline agent label master environment def var1 default value def var2 defaul
  • “抄送”c++ istream?

    对于我自己的小解析器框架 我试图定义 类似 以下函数 template
  • AES 实施速度

    我已经编写了 AES 的 C 实现 并尝试使其尽可能快 我刚刚开始编程并接受 IT 培训 到目前为止 我已经实现了约 600 的速度提升 但仍然非常慢 为了将我的 AES 实现与我在 Linux 终端中使用的 openssl speed 命
  • 如何在 Material UI 中布局表单?

    我正在尝试使用 MaterialUI Grid 组件和字段构建以下表单布局 Form Field 1 Field 2 TextArea
  • 从 Angular JS 表单发布数据时出错

    我有一个 angularJS 表单 它将数据发布到 scalatra servlet 提交表单后 我无法在 scalatra servlet 中获取任何表单参数 下面是我的代码 AngularJS scope createUser func
  • 使用 JavaScript 隐藏网格项

    我有一个 2 x 2 CSS 网格 每个网格项都简要描述了一项服务 小型企业网站 每个网格项都有一个按钮来了解有关所述服务的更多信息 当用户单击四个按钮之一以了解更多信息时 我希望该网格项展开以占据整个 2x2 网格 我已经在工作 并且其他
  • 尝试从联合中提取类型时出现类型错误

    我正在尝试将类型定义添加到一些使用通过网络工作人员传递消息的代码中 调度的消息有一个字符串类型的成员 可以在运行时使用它来区分它们 One type of Message export interface IOpenFileWMsg typ
  • 选择随机种子并保存

    我想选择一个随机种子numpy random并将其保存到变量中 我可以使用设置种子numpy random seed seed None 但是你如何让 numpy 选择一个随机种子并告诉你它是什么 号码好像用过 dev urandom默认情
  • Hibernate setMaxResult 对父集合也限制子集合

    我有一个带有 ManyToMany fetch FetchType EAGER 子集合的父实体 我只需要加载我找到的父实体的第一条记录 因此我使用以下标准加载它 session createCriteria Parent class set
  • 套件构建过程中出现异常如何解决?

    我已按照以下步骤测试我的应用程序 我已经创建了 Android 项目 我已经为我的示例应用程序和测试应用程序创建了调试签名 需要测试 将sampleapp debug apk放在bin文件夹中 我的工作区在那里 在模拟器中安装了 testa
  • 如何禁用ant design日期选择器中的所有星期日和特定日期数组

    以下代码禁用了包括今天在内的所有先前日期 但我想禁用 ant design 日期选择器中的所有星期日和特定日期数组 lt DatePicker size large format DD MM YYYY nChange this onDate
  • 如何在 Eloquent ORM Laravel 中删除“updated_at”同时保留“created_at”

    在 Laravel 中 我有一个仅创建但未更新的模型 所以 我只想删除updated at场地 但是created at字段为必填项 那么我怎样才能只删除updated at场 同时保持created at field 在您的模型中添加以下
  • 使用自动映射器映射异步结果

    我们正在创建 angularjs 应用程序的 Web Api 应用程序 Web Api 返回 json 结果 第一步是获取数据 public List
  • WSL,使用“wsl --exec ”或“wsl -- ”运行 linux 命令

    wsl h显示以下内容 exec e
  • “创建新的 Android 虚拟设备 (AVD)”对话框中的“确定”按钮不执行任何操作

    尝试通过以下步骤从 eclipse 环境创建 AVD 单击 Windows Android 虚拟设备管理器 这将打开 Android 虚拟设备管理器 对话框 在对话框中 单击 新建 这将打开 创建新的 Android 虚拟设备 AVD 对话
  • 反应未定义

    我刚刚开始玩反应宝石 https github com reactjs react rails但我似乎遇到了问题 使用下面的代码 每当我路由到 React 示例页面时 我注意到浏览器开发人员控制台中会显示 React 未定义 它指的是这一行
  • 终止信号示例

    我正在尝试这个例子 http www cs cf ac uk Dave C node24 html http www cs cf ac uk Dave C node24 html include
  • 检测目标 CPU 上的对齐内存要求

    我目前正在尝试构建一个可以在多种机器上运行的代码 从手持口袋和传感器到数据中心的大型服务器 这些架构之间的 许多 差异之一是对齐内存访问的要求 标准 x86 CPU 不需要对齐内存访问 但许多其他 CPU 需要它 如果不遵守规则 就会产生异