
On Thu, Feb 26, 2009 at 11:33 AM, Daniel Fischer
Am Donnerstag, 26. Februar 2009 12:07 schrieb Colin Paul Adams:
> "Thomas" == Thomas Davie
writes: Thomas> The {-# UNPACK #-} tells the compiler that it can unpack Thomas> the Int – meaning that a Position will be neatly packed Thomas> into 12 bytes.
What would be the difference if there was no UNPACK pragma?
Section 8.12.10 of the users' guide says: "The UNPACK indicates to the compiler that it should unpack the contents of a constructor field into the constructor itself, removing a level of indirection."
It has more, and also says when it's not a good idea to use it.
Int is defined as
data Int = I# Int#
where Int# is a raw machine int. If you use the {-# UNPACK #-} pragma, you tell GHC that you'd very much like Position to be stored as constructor + three contiguous raw machine integers. Mostly, it will do so. If you don't use the pragma, i.e. have
data Position = Position { posOffset :: !Int , posRow :: !Int , posColumn :: !Int }
, GHC may or may not decide to store it thus, with -O2 it's not too unlikely, I think. But it's also not unlikely that it will be stored as constructor + three pointers to three evaluated Ints, which is much better than pointers to thunks, but not as good as having the raw values directly by the constructor.
Cheers, Daniel _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
Are there any guarantees here, or is it just me telling the compiler to please do what I say, but the compiler can decide not to follow my wishes? Is address aligning predictable? I'm basically wondering if it'd be possible to to use this mechanism to avoid using FFI when reading data that basically is a dump of structs in a C program. /M -- Magnus Therning (OpenPGP: 0xAB4DFBA4) magnus@therning.org Jabber: magnus@therning.org http://therning.org/magnus identi.ca|twitter: magthe