swift 如何确定结构体占用了多少内存?

1dkrff03  于 2022-12-02  发布在  Swift
关注(0)|答案(3)|浏览(189)

简单的问题:有没有办法找出特定结构体占用了多少内存?
理想情况下,我希望它打印到控制台。

**编辑:**Krumelur提供了使用sizeof函数的简单解决方案。

不幸的是,它似乎不能很好地与数组一起工作。

println("Size of int \(123) is: \(sizeofValue(123))")
println("Size of array \([0]) is: \(sizeofValue([0]))")
println("Size of array \([0, 1, 8, 20]) is: \(sizeofValue([0, 1, 8, 20]))")

生成以下输出:

Size of int 123 is: 8
Size of array [0] is: 8
Size of array [0, 1, 8, 20] is: 8

因此,不同大小的数组给予相同大小的数组,这肯定是不正确的(至少对我来说是这样)。

jv4diomz

jv4diomz1#

Swift中有sizeof(T)操作符,它返回指定类型或变量所占的大小,就像在C中一样。
然而,与C不同的是,没有堆栈分配数组(静态数组)的概念。数组是指向对象的指针,这意味着它的大小总是指针的大小(这与C中的堆分配数组相同)。要获得数组的大小,必须执行以下操作:

array.count * sizeof(Telement)

但即使这样,也只有在Telement不是分配堆内存的对象时才成立。

5vf7fwbs

5vf7fwbs2#

Swift标准库现在似乎支持这一点。
Docs

MemoryLayout.size(ofValue: self)
xbp102n0

xbp102n03#

正如Declan McKenna所指出的,MemoryLayout.size现在是标准库(“基础”)的一部分。
您可以通过以下两种方式之一使用此功能:要么通过〈〉括号语法得到 type 的大小,要么通过调用函数得到 value 的大小:

var someInt: Int
let a = MemoryLayout.size(ofValue: someInt)
let b = MemoryLayout<Int>.size
/* a and b are equal */

假设您有一个T类型的数组arr,您可以按如下方式获取分配的大小:

let size = arr.capacity * MemoryLayout<T>.size

请注意,您应该使用arr.capacity,而不是arr.count。容量是指为数组保留了多少内存,即使尚未写入所有值。
另一件需要注意的事情是,内存分配可能有点棘手。如果你分配了一大块内存,却从来没有写入过,操作系统可能不会报告应用程序实际上在使用这块内存。操作系统可能会给你malloc一些巨大的内存块,比你实际内存大一千倍,但如果你从来没有真正写入过任何东西,它就不会“真正”得到分配。
此答案中描述的方法用于获取阵列分配的假设最大数量。

相关问题