当前位置: 首页 > 面试题库 >

在Swift中对齐与大步前进

章承基
2023-03-14
问题内容

在斯威夫特4,MemoryLayout结构告诉你sizestridealignment一个类型。

我了解大小和步幅,但实际上不了解。

是否有 示例 显示对齐方式,与跨度有何不同,与跨度的值不同以及在何处使用跨度不正确但在对齐方式中正确?

我是否可以总是相互计算?


问题答案:

这是一个简单的示例:

struct Foo {
    let a: Int16
    let b: Int8
}

print(MemoryLayout<Foo>.size)       // 3
print(MemoryLayout<Foo>.alignment)  // 2
print(MemoryLayout<Foo>.stride)     // 4
  • 对齐 的结构是其所有领域的最大的队列,在这种情况下,最大的21
  • 结构的 跨度 是将大小四舍五入为对齐的大小,此处3四舍五入为的倍数4

跨度是内存中相同类型的连续实例之间(起点)之间的距离:

let array = [Foo(a: 1, b:2), Foo(a: 3, b: 4), Foo(a: 5, b: 6)]
array.withUnsafeBytes {
    print(Data($0) as NSData) // <01000234 03000474 0500066f>
    print($0.count) // 12
}

结构跨度是结构对齐的倍数,因此所有实例(因此所有实例字段)都已正确对齐。

详细信息可以在Type
Layout中
找到

脆弱的结构和元组布局

结构和元组当前共享相同的布局算法,在编译器实现中称为“通用”布局算法。算法如下:

  • 以0的大小和1的对齐方式开始。
  • 以元组的元素顺序或结构的var声明顺序遍历字段。对于每个字段:
    • 通过四舍五入到字段的对齐方式来更新大小,即将其增大到大于或等于大小的最小值,并且可以被字段的对齐方式整除。
    • 将字段的偏移量分配给size的当前值。
    • 通过添加字段的大小来更新大小。
    • 将对齐方式更新为最大对齐方式和字段的对齐方式。
  • 最终大小和对齐方式是聚合的大小和对齐方式。该类型的跨度是将最终大小四舍五入以对齐。



 类似资料:
  • 问题内容: 我正在迅速进行一个项目,并且能够制作精灵。我试图在许多不同的地方制作精灵。作为测试,我将游戏场景中的代码替换为: 我不明白的是,这段代码在左下角产生了一个精灵。正如预期的那样,在y方向上仅显示了一半的精灵,但是x方向似乎完全偏离了。如果我尝试将x值设置为289以下的任何数字,它将不会出现。0,0点真的是289,0还是我缺少什么?我正在为iPhone 6编程,如果有所作为。 谢谢! 问题

  • 一般有两种类型的SIMD指令: A、 使用对齐内存地址的,如果地址在操作数大小边界上未对齐,则会引发一般保护(#GP)异常: B.以及那些与未对齐的内存地址一起工作的,不会引发此类异常: 但我只是好奇,为什么我要开枪打自己的脚,并使用第一组的对齐内存指令呢?

  • 如图所示,我有代码在屏幕上绘制文本。textalign函数仅支持水平对齐。现在,我要添加对垂直对齐的支持。有人能帮我一下吗? 代码

  • 问题内容: 我正在使用iTextSharp将数据填充到在OpenOffice中创建的PDF模板中。它填充得很好,我正在获取适当的PDF。在该PDF中,有一些摘要会出现,那个地方我想使该文本与模板对齐。 我正在下面的代码,但它不起作用。 请帮忙。 谢谢。 问题答案: 假设您有一个纯AcroForm而不是我在注释中指出的混合表格,这就是更改字段四边形的方法: 错误地假设,四边形不是字段标志的一部分。它

  • 我试图将一个JLabel和一个JScrollPane(包含一个JTextArea)对齐到一个JPanel的左边。当我把JTextArea直接放在面板中时,对齐是正确的。只有当JTextArea在滚动窗格中时,对齐方式才不正确。 下面的第一个图像带有滚动窗格,第二个图像没有滚动窗格。如何正确对齐滚动窗格?

  • 我正在用数字键盘制作登录屏幕,我似乎不能在窗格中对齐按钮的网格窗格。我做错了什么? GUI代码很冗长,而且这个帖子编辑器不允许我按原样发布问题,所以我需要这些额外的行让它接受我的问题。如果我认为我可以把代码缩减到数字广告。设置对齐(Pos.Center),并且仍然清楚地表明我是如何尝试将网格窗格居中的。我真诚地感谢那些可能借给我时间帮助我解决这个问题的人。 我的问题是GridPane本身绘制在屏幕