[Openmcl-devel] memory

Tim Bradshaw tfb at tfeb.org
Thu Apr 15 02:11:22 PDT 2010

On 14 Apr 2010, at 22:50, Toomas Altosaar wrote:

> For example, the same as above: take the case where you wish to
> mirror all the non-LISP specific implementation data in your instance
> through an FFI to and from a framework. This version will give you a
> lower bound as to how much memory requires reserving.
> Another example: let's say you wish to estimate how much
> memory/bandwidth/time is required for the serialization of a compound
> Lisp object between two (LISP) nodes located in remote locations on
> some network, assuming already that the other node is running the
> same version and has the same class definitions on hand. Without
> knowing the RAW number of bytes you will not be able to make an
> estimate.
>> Perhaps your objection is that this thing should not be called sizeof
>> because it's too reminiscent of the C function.
> I would object as well; it is much easier to expect a similarly named
> function to do the same thing across languages than to remember the
> differences.

OK, so I can see two objections here, I think:

1. You want the *name* "sizeof" to do what they would expect, from C,  
it would.  This is fine, I have no issues about what the function is  
called, and in any case "sizeof" is not a very Lispy name (size-of  
would be better).

2, But actually, as far as I can see, you don't want it to do what it  
does in C, I think.  because what it does in C, of course, is *not*  
return the raw number of bytes: it returns the number of bytes it  
would take to store an object, which (as in Lisp) is raw number of  
bytes + overhead, where C's overhead is typically padding. (This is  
why, despite the non-lispy name, I thought "sizeof" was reasonable,  
because it does the equivalent thing for Lisp that it does for C).

So, what do you want sizeof to do?  In your first example of copying  
Lisp data to some foreign language (say C), what you need to know is  
what *C's* sizeof returns for the struct you've defined in C to hold  
the data.  This is not the raw bytes, and I don't think it is easily  
derivable from them as it depends on layout (and perhaps compiler  
options - doesn't x86 support misaligned access? Do any compilers  
generate code which does this (I hope not)).

In the case where you're considering transmitting data over some  
network stream then what you want is probably the raw bytes, but this  
is not what C's sizeof tells you of course - in other words, if you  
were doing this in C, you could not use sizeof for this either, for  
non-trivial types.

So, I definitely don't think a function which returns the raw bytes  
used, without overhead, by an object should be called sizeof, because  
this might lead you to think that it would tell you, for instance, how  
much space it would take in C, which it would not do.  As far as I can  
see such a function would really only be useful for serializing data:  
maybe it should be called "serialized-size" or something.

More information about the Openmcl-devel mailing list