gpt4 book ai didi

swift - Swift 如何存储结构数组?

转载 作者:IT王子 更新时间:2023-10-29 05:37:49 25 4
gpt4 key购买 nike

您能否向 C 程序员准确解释当您在 Swift 中执行以下操作时,幕后发生了什么:

struct X { var a: Int32; var b: Int32 }
class Y { var a: Int32; var b: Int32 }
var x1 = X[](count: 1000)
let x2 = X[](count: 1000)
var y1 = Y[](count: 1000)
let y2 = Y[](count: 1000)

特别是,内存布局到底是什么?什么从栈中分配,什么从堆中分配?我们在这里分配了多少个独立的内存块?

我的猜测是沿着这些方向发生的事情:

  • x1 和 x2 是指向包含数组大小 (1000) 的连续内存块的指针,后跟 2000 个整数(存储 x1[0].a、x1[0].b、x1[1 ].a, ... 按此顺序);内存块是从堆中分配的。

  • y1 和 y2 是指向包含数组大小 (1000) 的连续内存块的指针,后跟 1000 个指针(存储对对象 y1[0]、y1[1]、... );这些中的每一个都指向一个单独的内存块,该内存块表示对象 Y 的一个实例,这些内存块包含引用计数器 + 字段 a 和 b;每个对象 Y 都是从堆中单独分配的。

这是否接近 Apple 当前的 Swift 实现中实际发生的情况?

在生成的机器代码中,存储或访问 x1 和 x2 的方式有什么不同吗? y1 和 y2 之间呢?

最佳答案

未指定。您可以反汇编编译后的代码,但这正是它当前所做的,它可能随时更改,恕不另行通知。

我确实理解 C 程序员想要弄清楚幕后情况的愿望。但你真的真的不应该在乎。这就像 C 语言问世时,习惯于汇编语言的程序员想要确切地知道结构存储在哪个物理内存地址,或者哪些局部变量被映射到 CPU 寄存器,哪些映射到堆栈帧。在非常早期的编译器中,这是您实际上可以知道的事情,但您真的不应该在意。即使您认为这会有所作为,也不会。

关于swift - Swift 如何存储结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24036998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com