On 21.09.2010 20:47, Mariano Martinez Peck wrote:


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

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