Get the size (in bytes) of an object on the heap

dynamic-allocation, heap-memory, memory-layout, swift

Solution

One option on Apple platforms, because Swift classes are currently built on top of Objective-C classes there, would be to use the Obj-C runtime function `class_getInstanceSize`, which gives you the size in bytes of an instance of the class, including any padding.

// on a 64-bit machine (1 word == 8 bytes)...

import Foundation

class C {}
print(class_getInstanceSize(C.self)) // 16 bytes metadata for empty class 
                                     // (isa ptr + ref count)

class C1 {
    var i = 0
    var i1 = 0
    var b = false
}

print(class_getInstanceSize(C1.self)) // 40 bytes
// (16 metadata + 24 ivars, 8 for i + 8 for i1 + 1 for b + 7 padding)

Problem

I'm aware you can use `MemoryLayout<T>.size` to get the size of a type `T`. For example: `MemoryLayout<Int32>.size // 4` However, for class instances (objects), `MemoryLayout<T>.size` returns the size of the reference to the object (8 bytes on 64 bit machines), not the size of the actual objects on the heap. ``` class ClassA { // Objects should be at least 8 bytes let x: Int64 = 0 } class ClassB {// Objects should be at least 16 bytes let x: Int64 = 0 let y: Int64 = 0 } MemoryLayout<ClassA>.size // 8 MemoryLayout<ClassB>.size // 8, as well :( ``` How can I get the size of the objects themselves? For those wondering, I have no real need for this, I'm just exploring around Swift and its interoperability with C.

Original source