对齐规则

2023-12-08

我在家庭作业问题上遇到了一些麻烦,我想知道是否有人可以为我指出正确的方向。

假设我们正在为一台机器编译 1字节字符,2字节 短整型、4 字节整数和 8 字节 实数,并具有对齐规则 需要每个原语的地址 数据元素为偶数倍 元素的大小。进一步假设 编译器不允许 重新排序字段。会有多少空间 被以下数组消耗?

A : array [0..9] of record
    s : short;
    c : char;
    t : short;
    d : char;
    r : real;
    i : integer;
end;

现在我在很大程度上理解了这个问题,但真正让我陷入困境的是“需要每个原始数据的地址的对齐规则 元素是元素大小的偶数倍”。在涉及对齐规则时,我的书没有太多描述,而且说实话,我什至不确定偶数倍是什么。任何帮助将不胜感激。

另外,我相信答案是 240 字节,我只是需要一些帮助才能到达那里。


让我们来分解一下:

“对齐规则”“要求每个原始数据元素的地址是元素大小的偶数倍”。我们谈论对齐规则并不是很有趣;我们已经知道了。

“要求每个原始数据元素的地址”是“元素大小的偶数倍”。现在我们已经取得进展了。我们有一个要求和范围:

Requirement: The address is an even multiple of the element's size.
Scope: Every primitive data element.

因此,每次我们定位一个元素时,我们都必须施加要求。

让我们尝试在内存中定位一个元素。我们首先要定位的是short贴上标签s。由于 Short 占用 2 个字节的内存,并且我们必须使其地址成为该大小的倍数,因此该地址必须是 2 的倍数。我们将该地址称为 N。

So, s占用空间来自N up to N + 2. (NOTE:对于所有这些范围,包括第一个端点,但不包括最后一个端点。这是计算机科学中描述整数范围的常用方法;在大多数情况下,这是迄今为止最有用且最不容易出错的方法。相信我。)

我们继续彼此的领域。

c占用一个字节,从N + 2 to N + 3.

我们在N + 3,但我们无法开始t在那里,因为N + 3是奇数(因为N甚至)。所以我们必须跳过一个字节。因此t范围从N + 4 to N + 6.

继续这种逻辑,我们最终得到d from N + 6 to N + 7; r from N + 8 to N + 16; i from N + 16 to N + 20. (NOTE仅当我们将 N 限制为 8 的倍数时,这才有效,或者r将不对齐。还行吧;当我们为数组分配内存时,我们可以根据需要对齐它的开头 - 我们只需要保持该点之后的数据顺序一致即可。)

所以我们需要at least该结构有 20 个字节。 (这是半开范围的优点之一:端点之间的差异等于大小。如果我们在范围中包含或排除两个端点,则必须进行 +1 或 -1 修正。)

现在假设我们尝试将数组布局为 10 个连续的 20 字节块。这行得通吗?不;假设元素 0 位于地址 256(8 的倍数)。现在r元素 1 中的 不会对齐,因为它将从 256 + 20 + 8 开始,不能被 8 整除。这是不允许的。

所以我们现在怎么办?我们不能只在前面插入额外的 4 个字节r在元素 1 中,因为数组的每个元素都必须具有相同的布局(更不用说大小)。但有一个简单的解决方案:我们在end of each元素。现在,只要数组从 8 的倍数开始,每个元素也将从 8 的倍数开始(这反过来又保持r对齐),因为现在大小是 8 的倍数。

我们得出结论,结构需要 24 个字节,因此数组需要 24 * 10 = 240 个字节。

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

对齐规则 的相关文章

随机推荐

  • python argparse store --foo=bar as args.key='foo', args.value='bar'

    我想解析一个具有互斥选项组的命令行 通常 我只会使用 foo bar这会在命名空间中产生 args foo bar 但是 由于所有这些选项都是互斥的 并且我对选项名称和传递给选项的参数都感兴趣 并且我有几个需要提供给下游的选项 所以我真正想
  • 当 Directory.GetFiles() 被拒绝访问时忽略文件夹/文件

    我试图显示在所选目录 以及可选的任何子目录 中找到的所有文件的列表 我遇到的问题是 当 GetFiles 方法遇到它无法访问的文件夹时 它会引发异常并且进程停止 如何忽略此异常 并忽略受保护的文件夹 文件 并继续将可访问的文件添加到列表中
  • 在 Python 3.7 上安装 Python.net 时出错

    我试图让 Python net pythonnet 在 Python 3 7 上工作 但在运行 setup py 时失败并出现以下错误 我假设它与路径行中缺少的条目有关 但我无法对它进行任何引用 它基本上是 Windows 7 上 Pyth
  • 如何更改 JavaScript 中的日期格式[重复]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 中设置日期格式 我有这个 HTML Start Date
  • JPA继承

    您好 我是 JPA 新手 我无法理解它如何处理继承 我有一个需要在不更改数据库方案的情况下解决的特定问题 但如果您找不到解决方案 我将不胜感激使用不同数据库方案的解决方案建议 欢迎 Hibernate TopLink 解决方案 如果我不清楚
  • 如何正确初始化 QWizard 页面?

    我在将数据从 QWizard 页面发送到下一页时遇到问题 我正在使用一个变量my nameQWizard 对象作为容器 我的方法是 每当我更改 QLineEdit 的文本时Page1 变量my name我的 QWizard 对象发生了变化
  • KeyboardEvent 的 Angular 4 单元测试

    我正在尝试为我编写的实用程序编写单元测试 以限制输入字段可用的字符 该方法获取键盘事件并确定已触发哪个 event code 并返回 true 或 event preventDefault 这很有效 但我无法在茉莉花 业力中测试它 来自模板
  • R 将字符串转换为时间

    我想将字符串转换为时间 我有一个时间字段 其中字符串只有四位数字和一个字母 A 或 P 数字之间没有冒号 表明它是时间 我想将 12 小时的字符串转换为 24 小时的时间 这样我就可以删除 A 和 P 这是一个例子 time c 1110A
  • 从 vbs 中具有特定扩展名的文件夹中获取最后修改的文件

    我有以下代码 我需要的只是找到扩展名为 PNG 和最近的最后修改日期的文件 我能够找到最后修改日期 但是如果我在文件上检查扩展名 则会出现 Object 某些数字 行需要 recentFile SCRIPT For Each objFile
  • 我可以在 iframe 上使用 postMessage,谁的 html 通过 - srcdoc 属性传递?

    我无法调用 postMessage 以防我在 srcdoc 属性中传递 html without sandbox allow scripts 它给出以下错误 Failed to execute postMessage on DOMWindo
  • 将字节流转换为数字数据类型

    假设我有一个字节流 其中我知道 64 位值 64 位随机数 的位置 字节顺序为 Little Endian 由于 PHP 的整数数据类型仅限于 32 位 至少在 32 位操作系统上 我如何将字节序列转换为 PHP 数字表示形式 我认为浮点就
  • 对非数字数据使用“bsxfun”

    有没有相当于bsxfun对于非数字数据 例如 我想比较存储在两个元胞数组中的所有字符串对 gt gt a aa bb cc gt gt b dd aa gt gt bsxfun strcmp a b not working for cell
  • Git:推送被拒绝

    我有一个团队 我们正在开发一个项目 我们的一名团队成员在 GitHub 上创建了一个存储库 并将其他人添加为协作者 我的团队成员将我们的代码提交到这个存储库 我对我的部分进行了更改 当我尝试提交它时 出现错误 如何将更改提交到我作为协作者的
  • 在完成块中调用时 UIAlertView 需要很长时间才能出现

    我的应用程序的一部分需要日历访问 这需要调用EKEventStore method void requestAccessToEntityType EKEntityType entityType completion EKEventStore
  • PySide 通过事件切换小部件?

    我想不通 我希望能够根据按钮点击等事件交换 QWidgets 但我遗漏了一些东西 而且我无法按照下面的代码行搜索到任何示例 我想要做的是单击顶部按钮之一并获取下面的小部件以在 QCalendar 或 QtextEdit 之间切换 我哪里出错
  • 从 JMS 侦听器类以编程方式更新某些视图

    我能够将 ActiveMQ 集成并在我的 OpenXava 应用程序中创建 JMS 使用者 现在 我需要使用接收到的数据更新某些瞬态视图 消息 它有几个问题需要考虑 例如 如何从 JMS 侦听器 java 类并将更改推送到当前视图 和 假设
  • 多核CPU单线程行为,未达到100%

    正如您从附图中看到的 我的双核机器上的 CPU 图形奇怪地对称 这是某种负载平衡 以防止一个核心比另一个核心使用更多 其背后的原因是什么 可能是热量分布 当然我主要关心的是 我的单线程 PSNR 图像算法是否达到 100 CPU 为 Cor
  • 为什么所有 openGL 对象都存储在 GLuint 中?

    我最好的猜测是 GLuint 持有一个指针而不是对象 因此它可以 持有 任何对象 因为它实际上只是持有一个指向内存中空间的指针 但如果这是真的 为什么我在使用这些变量时不需要取消引用任何内容 OpenGL对象名字是handles引用 Ope
  • 为每行插入一个数字输入 - R Shiny

    我有一个生成大矩阵的复杂代码 但在这里我附上一个简单的 可重现的示例 以便清楚地解释我想要的内容 这是代码 ui R library shiny shinyUI mainPanel Table Output tableOutput My t
  • 对齐规则

    我在家庭作业问题上遇到了一些麻烦 我想知道是否有人可以为我指出正确的方向 假设我们正在为一台机器编译 1字节字符 2字节 短整型 4 字节整数和 8 字节 实数 并具有对齐规则 需要每个原语的地址 数据元素为偶数倍 元素的大小 进一步假设