You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Swift中如何获取Any类型变量底层数据的真实内存大小?

问题原理说明
  1. 你观察到的返回值32是Any存在型容器本身的固定大小:在64位Swift运行时中,Any的内部结构由3个8字节的内联存储槽+1个8字节的类型元数据指针组成,总长度恰好为32字节。你直接将Any类型的变量传入MemoryLayout.size(ofValue:)时,方法返回的是这个外层容器的大小,而非其包裹的实际值的大小。
  2. 你尝试的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:27:01