On 21.09.2010 20:47, Mariano Martinez Peck wrote:
On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <adi@netstyle.ch <mailto: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
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