"Alexei Alexandrov" <[EMAIL PROTECTED]> wrote:
> >
> > Perhaps the following definition of Mem would work better:
> >
> >  struct Mem {
> >    u16 flags;
> >    u8  type;
> >    u8  enc;
> >    char *z;
> >    int n;
> >    i64 i;
> >    double r;
> >    char zShort[NBFS];
> >    void (*xDel)(void *);
> >  };
> >
> 
> Not exactly, since 'int' is still 4 bytes on Linux ia64. long/size_t
> is 8 bytes. In fact, I think that the rightest thing here would be to
> put zShort at the beginning of the structure, because in this case it
> would get the same alignment as returned from malloc and the rest of
> fields are strictly typed so that they are aligned by compiler
> properly.
> 
> But when I try to put zShort at the beginning, some strange thing
> happens - SQLite doesn't like it. I start SQLite shell, and it says
> immediately (or when I create a simple table):
> 

Come to think of it, I there are some places in the code that
assume that zShort[] is at the end of the structure.  There 
are places that memcpy() the first part of the structure and
ignore zShort[].  So moving zShort[] to any other place in the
structure will not work unless those places are changed.  And
those places are there for efficiency reasons so I am reluctant
to change them.

Perhaps a better fix is this:

  struct Mem {
    i64 i;         
    double r;      
    char *z;       
    int n;         
    u16 flags;     
    u8  type;      
    u8  enc;       
    void (*xDel)(void *);
    union {
      long double notUsed1;
      char zShort[NBFS];
    };
  };

The compiler would then (hopefully) insert an appropriate
amount of padding prior to zShort so that it had the same 
alignment restructions as a long double.

This approach uses an anonymous union, which I confess is
a C construct that I have never in 22 years of C programming
had the occasion to employ.  It seems to work well enough
using gcc 3.3.4.  But down in my gut I have this nagging
fealing that it will likely break on some compilers.

--
D. Richard Hipp   <[EMAIL PROTECTED]>

Reply via email to