什么是数据对齐?在 C 中类型转换指针时,为什么以及何时应该担心? [复制]

2024-01-03

我找不到一个像样的文档来解释对齐系统如何工作以及为什么某些类型比其他类型更严格地对齐。


我会尝试简短地解释一下。

什么是数据对齐?

计算机的体系结构由处理器和内存组成。 记忆是按细胞组织的,因此:

 0x00 |   data  |  
 0x01 |   ...   |
 0x02 |   ...   |

每个存储单元都有指定的大小,即它可以存储的位数。这是依赖于架构的。

当您在 C/C++ 程序中定义变量时,or more您的程序占用了不同的单元格。

例如

int variable = 12;

假设每个单元包含 32 位,并且int类型大小是 32 位,然后在你的内存中的某个地方:

variable: | 0 0 0 c |  // c is hexadecimal of 12.

当您的 CPU 必须对该变量进行操作时,它需要将其放入其寄存器中。一个CPU可以接收“1 clock“内存中的少量位,该大小通常称为WORD。这个维度也依赖于架构。

现在假设您有一个变量,由于某些偏移,该变量存储在两个单元格中。

例如,我有两个不同的数据要存储(我将使用“字符串表示形式更清晰"):

data1: "ab"
data2: "cdef"

所以内存将以这种方式组成(2个不同的单元):

|a b c d|     |e f 0 0|

那是,data1只占据细胞的一半,所以data2占据剩余部分和第二单元的一部分。

现在假设你的CPU想要读取data2。 CPU需要2 clocks为了访问数据,因为在一个时钟内它读取第一个单元,在另一个时钟内它读取第二个单元中的剩余部分。

If we align data2根据这个记忆示例,我们可以 介绍一种padding并转变data2全部在第二个牢房里。

|a b 0 0|     |c d e f|
     ---
   padding

这样CPU只会损失“1 clock“为了访问data2.

对齐系统的作用是什么

刚刚推出的对齐系统padding为了根据架构将数据与系统内存对齐。

我为什么要关心对齐?

我不会深入探讨这个答案。 然而,从广义上讲,内存对齐来自于上下文的要求。

在上面的示例中,使用填充(因此数据是内存对齐的)可以节省 CPU 周期以检索数据。由于内存访问次数较少,这可能会对程序的执行性能产生影响。

然而,除了上面的例子(仅为了解释目的)之外,还有许多其他场景,内存对齐是有用的,甚至是需要的。

例如,某些架构可能对如何访问内存有严格的要求。在这种情况下,填充有助于分配满足平台约束的内存。

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

什么是数据对齐?在 C 中类型转换指针时,为什么以及何时应该担心? [复制] 的相关文章

  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个

随机推荐

  • python 错误:“模块”对象没有属性“AF_UNIX”

    这是我的Python代码 if name main import socket sock socket socket socket AF UNIX socket SOCK STREAM sock connect 0 0 0 0 4000 i
  • 重写函数而不删除静态属性

    如果我有一个这样的函数 function a console log a 然后分配一个静态属性 如下所示 a static foo 但是假设我想用另一个函数覆盖该函数 如下所示 var old a a function console lo
  • Spring data mongodb,如何设置SSL?

    到目前为止 我还没有找到关于该主题的良好解释 文档 我在用
  • fwrite 是原子的吗?

    一个简单的问题 我需要在我的程序中添加一些日志记录 如果两个进程在同一文件上使用 fwrite 但不是同一文件描述符 则写入的日志消息将是原子的或混合的 有长度限制吗 是定义了 ANSI C 行为还是定义了实现 如果后者在 MacOSX L
  • 以编程方式添加 SwitchCompat 错误

    我正在尝试添加android support v7 widget SwitchCompat以编程方式 我收到此错误 java lang NullPointerException Attempt to invoke interface met
  • 检查用户输入是否在txt文件中,使用批处理

    我正在为局域网联网计算机批量制作聊天风格的系统 我想检查用户名是否被占用 如果不允许 我如何检查用户在这一行中输入的内容 set p name2 我已经在测试文件中尝试过这个 但无法让它工作 startup set fail set nam
  • findOne 可以工作,但不能获取全部/查找

    findOne 工作正常 db collection updates function err collection collection findOne author req user id function err doc 我正在尝试获
  • getaddrinfo,我没有得到任何 canonname

    我正在尝试读取有关特定主机的所有信息并打印出所有信息 我可以读取并打印出所有地址 但我没有读取任何 ai canonname 首先 我认为我的示例 www google com www irs gov 没有规范名称 但过了一会儿我发现我根本
  • 如何从控制器中包含的模块渲染js模板?

    我在控制器关注点中有一个操作 该操作包含在控制器中 此操作不会呈现在 respond to 块下指定的 js erb 文件 如何正确获取控制器关注点中的操作以成功呈现 js erb 文件 或任何视图 是我的路线有问题吗 模块操作的链接 li
  • String 子字符串在 Swift 中如何工作

    我一直在使用 Swift 3 更新一些旧代码和答案 但是当我使用 Swift 字符串和子字符串索引时 事情变得令人困惑 具体来说 我正在尝试以下操作 let str Hello playground let prefixRange str
  • SVN:创建文件夹的转储文件

    我正在尝试在 SVN 存储库中创建文件夹的转储文件 我的目标是将此转储导入另一个存储库 但那是另一个故事 我读了大概 20 页关于这个的内容 他们都告诉我要使用svndump过滤器 http svnbook red bean com en
  • wkhtmltopdf 每次运行都会生成不同的校验和

    我试图验证从运行到运行时从 wkhtmltopdf 生成的内容是否相同 但是每次运行 wkhtmltopdf 时 我都会针对同一页面获得不同的哈希 校验和值 我们正在谈论一些真正基本的东西 比如使用以下 html 页面 p This is
  • Azure 虚拟机上的 HTTPS

    我正在将我们的网站迁移到 Azure 并在 Windows Server 2012 VM 上运行 我已从 GoDaddy 购买了通配符 SSL 证书 并且已在虚拟机上安装和配置了它 我还配置了 IIS 以利用此证书来处理端口 443 上的所
  • 如何删除数据框中空值数量超过 x 的行? [复制]

    这个问题在这里已经有答案了 我正在尝试删除数据框中具有超过 7 个空值的行 请提出一些有效的方法来实现这一目标 如果我理解正确的话 只有当一行中的 nan 总数超过时 才需要删除行7 df df df isnull sum axis 1 l
  • 使用什么 Java 异常类来处理 HTTP 错误?

    我正在使用阿帕奇Http客户端 http hc apache org httpclient 3 x 并且希望通过 Java 异常机制向调用代码传达 HTTP 错误 400 错误请求 404 未找到 500 服务器错误等 Java 标准库或广
  • WebSockets 版本之间的协议差异是什么?

    是否有任何地方的摘要协议差异各种 WebSockets 草案之间的关系 浏览器支持级别仍然遍布各处 因此仅考虑 RFC 是不够的 显然 Sec WebSocket Version 发生了变化 而且我知道早期的格式非常不同 然而 我指的是协议
  • Angular 9 Google 地图 API 地点自动完成

    我有一个 Angular 9 刚刚从 8 迁移 我需要使用 Google Places API 我有一个 API 密钥 进行地址自动完成 我可以使用 angular googlemaps 库显示地图 但我无法制作自动完成工作 我尝试使用ht
  • 使用 libvlc 将相机流式传输到内存并显示帧

    我正在尝试使用 libvlc 将捕获设备 相机 流式传输到内存中 我无法显示内存中存储的数据的图像 内存内容看起来没问题 我使用 Visual Studio 及其内存窗口检查了它 imshow 创建的图片始终是灰色的 如何显示内存中存储的图
  • jquery按钮不响应click方法

    所以我使用append方法用jquery动态渲染一个段落 我想向它添加一个点击事件 但由于某种原因 点击事件不起作用 我知道解决方案可能很简单 但我是jquery的新手 我会很感激任何帮助 我知道函数内部的代码可以工作 因为我用静态按钮测试
  • 什么是数据对齐?在 C 中类型转换指针时,为什么以及何时应该担心? [复制]

    这个问题在这里已经有答案了 我找不到一个像样的文档来解释对齐系统如何工作以及为什么某些类型比其他类型更严格地对齐 我会尝试简短地解释一下 什么是数据对齐 计算机的体系结构由处理器和内存组成 记忆是按细胞组织的 因此 0x00 data 0x