在Swift中如何获取Any类型变量底层数据的真实内存大小?
问题原理说明
- 你观察到的返回值32是Any存在型容器本身的固定大小:在64位Swift运行时中,Any的内部结构由3个8字节的内联存储槽+1个8字节的类型元数据指针组成,总长度恰好为32字节。你直接将Any类型的变量传入
MemoryLayout.size(ofValue:)时,方法返回的是这个外层容器的大小,而非其包裹的实际值的大小。 - 你尝试的
MemoryLayout<type(of: anyInt)>.size无法编译通过,是因为MemoryLayout的泛型参数要求是编译期就确定的静态类型,而type(of:)返回的是运行时才能拿到的动态元类型,二者无法匹配。
解决方案
我们可以通过泛型函数动态提取Any包裹的实际类型的内存大小:泛型参数会在运行时自动绑定到Any内部的真实类型,此时调用MemoryLayout读取的就是对应真实类型的大小。
实现代码
/// 获取Any变量包裹的实际值的内存大小 func getUnderlyingValueSize<T>(of value: T) -> Int { MemoryLayout<T>.size } // 测试用例 let regularInt: Int = 1 let anyInt: Any = Int(2) as Any MemoryLayout<Int>.size // 4 getUnderlyingValueSize(of: anyInt) // 输出4,符合预期 MemoryLayout.size(ofValue: regularInt) // 4 MemoryLayout.size(ofValue: anyInt) // 32,为Any容器本身大小
补充说明
如果Any包裹的是类类型实例,上述方法返回的是类实例指针的大小(64位系统下固定为8字节)。如果你需要获取堆上类实例的实际内存占用,可以使用Swift运行时的class_getInstanceSize方法:
import ObjectiveC /// 获取类类型实例在堆上的实际内存占用大小 func getHeapInstanceSize(of anyValue: Any) -> Int? { guard let cls = type(of: anyValue) as? AnyClass else { // 非类类型返回空,可按需调整返回值 return nil } return class_getInstanceSize(cls) }
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

