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
Please, at least do some refactoring :)
Object >> sizeInMemory
��� "Answer the number of bytes consumed by this instance including
object header."
��� | isCompact headerBytes contentBytes |
��� isCompact := self class indexIfCompact > 0.
��� contentBytes := self class instSize * Smalltalk wordSize. "inst
vars"
��� self class isVariable ifTrue:
��� ��� [ |bytesPerElement|
��� ��� ��� bytesPerElement := self class isBytes ifTrue: [1]
ifFalse: [4].
��� ��� ��� contentBytes := contentBytes + (self basicSize *
bytesPerElement)].
��� � headerBytes :=
��� ��� ��� ��� ��� contentBytes > 255
��� ��� ��� ��� ��� ��� ifTrue: [12]
��� ��� ��� ��� ��� ��� ifFalse: [isCompact ifTrue: [4] ifFalse:
[8]].
��� ��� ��� ^ headerBytes + instVarBytes
�
Also, in a 64-bit image, I suspect you may have to make a
distinction between class isWords as well.
ie:
self class isBytes ifTrue: [1] ifFalse: [self class isWords ifTrue:
[4] ifFalse: [Smalltalk wordSize]]
Cheers,
Henry