你可以向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)
Run Code Online (Sandbox Code Playgroud)
特别是,内存布局究竟是什么?从堆栈分配什么,从堆分配什么?我们在这里分配了多少个独立的内存块?
我的猜测是沿着这些方向发生的事情:
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 寄存器以及哪些局部变量被映射到堆栈帧。在非常早期的编译器中,您实际上可以知道这一点,但您确实不应该关心。即使您认为这会有所作为,也不会。
| 归档时间: |
|
| 查看次数: |
3282 次 |
| 最近记录: |