简单的问题:有没有办法找出特定结构体占用了多少内存?
理想情况下,我希望它打印到控制台。
**编辑:**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
因此,不同大小的数组给予相同大小的数组,这肯定是不正确的(至少对我来说是这样)。
3条答案
按热度按时间jv4diomz1#
Swift中有
sizeof(T)
操作符,它返回指定类型或变量所占的大小,就像在C中一样。然而,与C不同的是,没有堆栈分配数组(静态数组)的概念。数组是指向对象的指针,这意味着它的大小总是指针的大小(这与C中的堆分配数组相同)。要获得数组的大小,必须执行以下操作:
但即使这样,也只有在
Telement
不是分配堆内存的对象时才成立。5vf7fwbs2#
Swift标准库现在似乎支持这一点。
Docs
xbp102n03#
正如Declan McKenna所指出的,MemoryLayout.size现在是标准库(“基础”)的一部分。
您可以通过以下两种方式之一使用此功能:要么通过〈〉括号语法得到 type 的大小,要么通过调用函数得到 value 的大小:
假设您有一个
T
类型的数组arr
,您可以按如下方式获取分配的大小:请注意,您应该使用
arr.capacity
,而不是arr.count
。容量是指为数组保留了多少内存,即使尚未写入所有值。另一件需要注意的事情是,内存分配可能有点棘手。如果你分配了一大块内存,却从来没有写入过,操作系统可能不会报告应用程序实际上在使用这块内存。操作系统可能会给你
malloc
一些巨大的内存块,比你实际内存大一千倍,但如果你从来没有真正写入过任何东西,它就不会“真正”得到分配。此答案中描述的方法用于获取阵列分配的假设最大数量。