在Swift 4中,MemoryLayout结构告诉您类型的大小,跨度和对齐方式.

我理解大小和步幅,但不是真正的对齐.

是否有一个示例显示了什么是对齐,它与步幅有什么不同,何时它与步幅有不同的值,以及使用步幅但使用对齐是否正确?

我可以一直计算另一个吗?

这是一个简单的例子:
struct Foo {
    let a: Int16
    let b: Int8
}

print(MemoryLayout<Foo>.size)       // 3
print(MemoryLayout<Foo>.alignment)  // 2
print(MemoryLayout<Foo>.stride)     // 4

>结构的对齐是所有结构的最大对齐
字段,在这种情况下最大为2和1.
>结构的步幅是四舍五入到对齐,
这里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
}

struct stride是struct alignment的倍数,因此
所有实例(以及所有实例字段)都已正确对齐.

细节可以在
Type Layout:

Fragile Struct and Tuple Layout

Structs and tuples currently share the same layout algorithm,noted as the “Universal” layout algorithm in the compiler implementation. The algorithm is as follows:

  • Start with a size of 0 and an alignment of 1.
  • Iterate through the
    fields,in element order for tuples,or in var declaration order for
    structs. For each field:
    • Update size by rounding up to the alignment
      of the field,that is,increasing it to the least value greater or
      equal to size and evenly divisible by the alignment of the field.
    • Assign the offset of the field to the current value of size.
    • Update
      size by adding the size of the field.
    • Update alignment to the max of
      alignment and the alignment of the field.
  • The final size and alignment are the size and alignment of the aggregate. The stride of the type is the final size rounded up to alignment.

在Swift中对齐vs步幅的更多相关文章

  1. 在Swift中对齐vs步幅

    在Swift4中,MemoryLayout结构告诉您类型的大小,跨度和对齐方式.我理解大小和步幅,但不是真正的对齐.是否有一个示例显示了什么是对齐,它与步幅有什么不同,何时它与步幅有不同的值,以及使用步幅但使用对齐是否正确?我可以一直计算另一个吗?

  2. C语言字节序对齐以及空间利用率

    环境:ubuntu64bitgccvim运行结果:代码分析:sizeof()函数是求变量的字节数,这里stu1是一个Stu变量,Stu包含三个成员分别是:int,char*,char,理论上sizeof=4+8+1=13为什么实际结果确实24呢?网上查资料只是说效率会变慢.以上是我在做项目时发现的问题,经过查资料得出结果拿出来和大家分享下,以上纯属个人理解,如果发现有错请在下方评论,方便我及时更正.

  3. 分配内存按需要对齐

    在VS里面,使用_aligned_realloc和_aligned_malloc进行内存对齐。

  4. ios – 将未对齐的缓冲区提供给MTLBuffer是否安全?

    任何明显的原因,为什么这不起作用?再说一次,如果它是安全的,为什么首先强加要求?为什么API不是这样做的呢?

  5. 使用高速缓存行对齐,在C中修改全局共享状态的无锁检查

    >假设一个实例是structcache_line_aligned的每个实例都在64字节边界上对齐,并且恰好使用一条高速缓存行>使用typedef作为类型声明不会改变__attribute__>在实例化结构体时,我不需要使用aligned_malloc,如果struct用__attribute__声明…最后一个使用缓存线对齐方法的函数的草图能够有效地检查全局状态是否被其他线程修改:对不起,长篇文章谢谢!

  6. c – 编译器(G)似乎为它所需要的类的实例分配更多的内存

    它应该是应该没有当我编译的代码与类定义也包括一个双,即它仍然分配16个字节,这在这种情况下是有道理的.那么为什么编译器只需要8个分配16个字节呢?解决方法这与栈框对齐有关,而不是结构对齐.如果你在对象上做了一个sizeof(),你会看到你期望的结构对齐和填充.但是,堆栈框架略有不同.在今天的大多数系统中,堆栈对齐是16字节(或更多),以适应SSE内存访问.

  7. realloc是否保持posix_memalign的内存对齐方式?

    对齐的malloc是posix_memalign,没关系,但是对齐的realloc呢?realloc是否保留对齐方式或如何确保重新分配的内存具有相同的对齐方式?

  8. libc的std :: basic_string的16字节对齐模式背后的原因是什么?

    我想知道在这里使用硬编码16作为数字背后是否存在任何特定的理由,或者它是否只是用作“漂亮的’圆形’数字”.对于64位计算机,16对等于,这是有道理的.但__alignment的完全相同的值也用于32位架构,所以…?

  9. c – 如何使用此宏来测试内存是否对齐?

    我是一名初学者,我读过有关该主题的this文章.现在,我已经阅读了this问题来检查你的指针是否对齐.我正在用这个玩具示例main.cpp测试它:并使用icpc-std=c11-omainmain.cpp进行编译.最终的印刷是:但是,如果我在4张照片之前加上3行:这是结果:特别是,我不明白最后的0.为什么它与上一次印刷不同?

  10. C 11内存模型是否可以防止内存撕裂和冲突?

    >在系统内存单元中有不同对象的地方,例如:一个32位字中的两个16位有符号整数,并且每个独立对象的独立更新都需要写入整个存储单元?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部