【问题标题】:Which will consume more memory?哪个会消耗更多内存?
【发布时间】:2020-06-11 22:27:27
【问题描述】:

假设有两个数组,一个具有 nClass 元素,另一个具有 nStruct 元素。哪个会消耗更多内存?当我们开始操作数组时会发生什么。以下是我尝试过的。

class C {
    var a = ""
}

struct S {
    var a = ""
}


func sizeOf<T>(_ value: T) {
    print(MemoryLayout.size(ofValue: value))
}

let classVar = C()
let structVar = S()

let arrayClass = [classVar, classVar, classVar]
var arrayStruct = [structVar, structVar, structVar]

sizeOf(classVar)
sizeOf(structVar)
sizeOf(arrayClass)
sizeOf(arrayStruct)

var newStruct = structVar
newStruct.a = "Value changed"

sizeOf(structVar)
arrayStruct.append(newStruct)
sizeOf(arrayStruct)

输出

8
16
8
8
16
8

为什么 struct 的大小大于 class 以及为什么两个数组的大小相同?是因为数组本身是一个结构吗?谁能提供详细的解释?

【问题讨论】:

  • 为什么不分别分配一百万并找出答案?
  • @tadman 我尝试附加10000 元素,结果是一样的。但是在操场上计算这个需要很多时间,分配一百万个每个需要更长的时间。
  • 这至少是一个数据点。请注意,如果编译,分配时间不会太长,所以如果这是一个选项,请尝试。这是否列出了对象的总内存占用?
  • @Jonathan 如果您有数据,值得添加作为答案。
  • Swift 结构通常取决于其组件的大小,在这种情况下,String 的大小为 16 字节,这就是您所看到的。类通常是指针大小的,因为它们是对某处分配的内存的引用。 Arrays 本身的布局方式是,无论它们包含什么,它们都是固定大小的(我假设它们是指向某些底层实现的指针)。

标签: swift class struct


【解决方案1】:

我认为这也有关系:Struct Memory Size vs. Class Memory Size

我运行了结构 10,000,000
我跑了10,000,000
我将 suclass 运行到 10 层 10,000,000 每层
我运行了枚举案例,并初始化了枚举 10,000,000
他们都打印了8(我会提供图片)


我确实发现这样做会打印 16

struct S { struct SS { var a = "" } }
SS() // 10,000,000 times

对于结构体和递归结构体,XCode 给出的实际内存大小实际上更大,约为 170MB,我只是想指出这一点。

所有结构:~170 MB (甚至是递归结构)
所有类:~97 MB (甚至是子类) sup>
所有枚举:~20 MB


【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多