RE: How do tagged data structures work in Strongtalk?
"David Griswold" <[email protected]> Sun, 27 May 2007 19:06:45 +0200
| Newsgroups | gmane.comp.lang.smalltalk.strongtalk |
|---|---|
| Message-ID | <[email protected]> |
> -----Original Message----- > From: prunedtree > > On May 27, 12:54 am, Richard <[email protected]> wrote: > > I'm wondering how tagged data structures work in strongtalk. Are > > objects always 4 byte aligned allowing the low two order bytes to be > > used for tagging. The tag is two bits, not two bytes, which is probably what you meant :-). > > If this is the case how to floats and doubles work? > > How do you gracefully move from an unboxed double to a boxed double? > > Or are doubles always boxed? What about floats? > > The only unboxed values in strongtalk are smis (smallintegers). All > others are full heap-allocated objects. There are no single precision > floating point values in strongtalk, only 64-bit fp (C "double"). > doubleOops take 128 bit: 4 byte GC header, 4 byte class oop, 8 byte > data. Actually there are experimental unboxed doubles, however they can only be used within a method, not passed, and are not unified with the type system. See the Mandelbrot application for an example. They work, and are very fast, but not very complete. > > > Is there a primitive array type that allows one to have an array of > > doubles? > > At the VM level, yes. But it's not implemented in the system. All > arrays working on raw data (even external data) will probably be > unified. Yes, prunedtree is right, I believe there are the necessary VM types and primitives, but no class in Smalltalk using them right now. But it would be incredibly simple to implement; probably only a few small methods, although the VM functionality probably hasn't been tested. > > Is there a way to have such an array interact gracefully with > > an Object array? e.g. if you put an object in your double array can it > > turn into an Object array with boxed doubles? > > Of course. If you have basic encapsulation, #at: will always return > objects, to access doubles the VM will box them. I don't think that's quite what he was asking; you couldn't store a non-double into a double array and have the double array turn into an object array, without using a become: operator, which isn't there right now, unless you designed a special hybrid array class that held a secondary array internally that it could replace as necessary. But that would cause reallocation of the entire array when it happens, and wouldn't be reversible. > > Is this type of > > situation helped by having a static type system in strongtalk? > > No. The static type system is irrevelant to the implementation and > performance of the VM. > > > > > I presume the recent brenchmarking example discussed in relation to > > memory allocation was designed to test the precision of strongtalk > > arithmetic as well as its performance. > > What benchmark do you have in mind exactly ? > > > > > Is there accepted wisdom of the merits of boxed and unboxed primitive > > types in smalltalk/strongtalk? > > First, there's only one type in smalltalk/strongtalk: objects. > Regarding implementation, smis have indeed different semantics from > most objects: they are not heap-allocated (you can't only pass them by > copy, never by reference). This is common in smalltalks. Everything > else is boxed objects. There are a couple of reasons why there are no double arrays in the system might now. First of all, it just hadn't been needed yet. But more importantly, I have an objection to them. The problem with a double array is that it must allocate a double every time you access an array element. In general, reads are much more frequent than writes, and so in the common case you can cause *vast* amounts of allocation without realizing it. In such a situation, it is actually better to allocate an object array, with individually allocated doubles; you will usually do far less total allocation that way, and accessing individual elements will be actually be faster; the main downside is a bit more than twice the space is required (two more words for each double header, and another word for the reference to it in the array, vs. two words). That is the basic problem with unboxed doubles in general: every time an unboxed double passes across into boxed-object land, it has to be reallocated, and this sort of invisible allocation can easily cause massive amounts of accidental alllocation. So in general, I'm only an advocate of unboxed doubles in situations where they are provably immediate results that can be held in registers or on the stack and discarded immediately. -Dave --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Strongtalk-general" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/strongtalk-general?hl=en -~----------~----~----~----~------~----~------~--~---