[Vm-dev] Simple question about objects, headers and sizes
Mariano Martinez Peck
marianopeck at gmail.com
Mon Jun 6 07:21:41 UTC 2011
On Mon, Jun 6, 2011 at 6:09 AM, Javier Pimás <elpochodelagente at gmail.com>wrote:
> Hi, I'm investigating the format of objects in memory. After some time I
> got this conclusions/questions I'd like to know more about:
> - Oops must be at least 16 bits aligned, because of SmallIntegers tagging,
> is that right?
Aren't they 31 bits? There is only one tag bit.
SmallInteger maxVal = 1073741823
(2 raisedTo: 30) - 1 1073741823
30 because there is another bit for the sign I think.
> - Raw object sizes are 32 bits aligned, because of size field in header
> which is in 32 bits words. So that for byte indexed instances there may be
> at most 3 wasted bytes (format field in that case tell the amount not used
> of the last 4 bytes).
Yes, for example 'a', 'bb', 'ccc' and 'dddd' they all occupy 4 bytes in the
VM (we discuss about that recently in the thread of Fuel I think). The VM
knows how much are really used by accessing the "size" value in the object
> Is that the way that the VM assures the alignment of the oops?
> - And the last one and the most puzzling for me: how does objectAfter:
> anOop work? I mean, for what I see, it returns the addition of anOop and the
> size of the object pointed by anOop, but how can it be sure that that is the
> base header and not the size or class field of the extended header?
I am not sure if I understood. #objectAfter: uses #sizeBitsOf:
"Answer the number of bytes in the given object, including its base
header, rounded up to an integral number of words."
"Note: byte indexable objects need to have low bits subtracted from this
| header |
header := self baseHeader: oop.
(header bitAnd: TypeMask) = HeaderTypeSizeAndClass
ifTrue: [ ^ (self sizeHeader: oop) bitAnd: LongSizeMask ]
ifFalse: [ ^ header bitAnd: SizeMask ].
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Vm-dev