SIZEOF returns the size, in bytes (8-bits, like a
CHAR), of an OBJECT or a built-in type (like
This can be useful for determining storage requirements.
For instance, the following code fragment prints the size of the object
OBJECT rec tag, check table:ARRAY data:LONG ENDOBJECT PROC main() WriteF('Size of rec object is \d bytes\n', SIZEOF rec) ENDPROC
You may think that
SIZEOF is unnecessary because you can easily calculate the size of an object just by looking at the sizes of the elements.
Whilst this is generally true (it was for the
rec object), there is one thing to be careful about: alignment.
This means that
LONG and object typed elements must start at an even memory address.
Normally this isn't a problem, but if you have an odd number of consecutive
CHAR typed elements or an odd sized
ARRAY OF CHAR, an extra, pad byte is introduced into the object so that the following element is aligned properly.
ARRAY OF CHAR this pad byte could be considered part of the array, so in effect this means array sizes are rounded up to the nearest even number.
Otherwise, pad bytes are just an unusable part of an object, and their presence means the object size is not quite what you'd expect.
Try the following program:
OBJECT rec2 tag, check table:ARRAY data:LONG ENDOBJECT PROC main() WriteF('Size of rec2 object is \d bytes\n', SIZEOF rec2) ENDPROC
The only difference between the
rec2 objects is that the array size is seven in
If you run the program you'll see that the size of the object has not changed.
We might just as well have declared the
table element to be a slightly bigger array (i.e., have eight elements).
Go to the Next or Previous section, the Detailed Contents, or the Amiga E Encyclopedia.