你能不能向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之间怎么样?
答案 0 :(得分:2)
未指明。您可以去编译已编译的代码,但这只是当前的代码,并且可能随时更改,而不会发出通知。
我确实理解C程序员想要弄清楚幕后发生了什么的愿望。但你真的不应该在乎。就像C出来时一样,程序员(曾经在汇编中工作)想知道结构存储的物理内存地址是什么,或者哪些局部变量被映射到CPU寄存器以及哪些是映射到堆栈帧。在早期的编译器中,你可以真正了解它,但你真的不应该关心。即使你认为它有所作为也不会。