On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <adi@netstyle.ch> wrote:
Its a simple method in Object:
Object>>sizeInMemory
"Returns the number of bytes used by this object in memory (including its header)"
| headerSize instanceSize |
headerSize := (self class indexIfCompact > 0 ifTrue: [ 4 ] ifFalse: [ 8 ]).
instanceSize := (self class isVariable
ifFalse: [ self class instSize * Smalltalk wordSize ]
ifTrue: [ (self basicSize * (self class isBytes
ifTrue: [ 1 ] ifFalse: [ Smalltalk wordSize ])) ]).
^ headerSize + instanceSize
Hi Adrian. Sorry for returning to this thread. I am trying to contemplate all the cases.
I was looking at SpaceTally and I found that maybe a better implementation could be something like this:
Object >> sizeInMemory
"Answer the number of bytes consumed by this instance including object header."
| isCompact instVarBytes bytesPerElement headerBytes total contentBytes |
isCompact := self class indexIfCompact > 0.
instVarBytes := self class instSize * 4.
self class isVariable
ifTrue: [
bytesPerElement := self class isBytes ifTrue: [1] ifFalse: [4].
total := 0.
contentBytes := instVarBytes + (self basicSize * bytesPerElement).
headerBytes :=
contentBytes > 255
ifTrue: [12]
ifFalse: [isCompact ifTrue: [4] ifFalse: [8]].
total := headerBytes + contentBytes.
^ total]
ifFalse: [
headerBytes :=
instVarBytes > 255
ifTrue: [12]
ifFalse: [isCompact ifTrue: [4] ifFalse: [8]].
^ headerBytes + instVarBytes ].
I guess I did some mistake but if we can arrive to a good implementation it would be really cool.
Thanks
mariano