On Sun, 23 Oct 2005 01:22:33 GMT, Steven Jones <>
wrote in comp.lang.c:
> On Sat, 22 Oct 2005 21:31:44 +0000, Nils Weller wrote:
>
> > On 2005-10-22, Steven Jones <> wrote:
> >> [...]
> >> However, I recently came across the following:
> >>
> >> unsigned short * p = (unsigned short *) str ;
> >>
> >> where str has been defined as unsigned char * elsewhere, and points to
> >> some data. str can point to an address with an arbitrary value, as far
> >> as divisibility is concerned.
> >>
> >> unsigned short x ;
> >> unsigned short * y = &x ;
> >>
> >> *y = p[0] ;
> >>
> >> In my naivete, I thought that this last line would result in an
> >> unaligned access whenever the address p is not a multiple of 2 (assuming
> >> that sizeof(unsigned short) is 2) but my little test code shows that
> >> sometimes it does, sometimes it doesn't.
> >
> > I have to ask HOW you determined whether that line resulted in an
> > unaligned access or not.
>
> Well, when I run run the code a big fat warning is printed out that says
> so. This is under Linux x86.
>
> > Your assertion that the divisibility of an address indicates the
> > alignment is correct in practice (though the C standards do not
> > guarantee that such a relationship between pointers and integers
> > exists.)
>
> > However, since unaligned access invokes undefined behavior in C, the
> > implementation is free to behave in any way it chooses upon encountering
> > such a construct, and that may be may be what you're seeing: Some
> > processors require correct alignment for all types and yield a bus error
> > for unaligned access, others do not (in particular, the x86 architecture
> > can perform misaligned data access in exchange for a performance
> > penalty), and still others may perform the access but silently yield
> > unwanted results. Some operating systems work around such processor
> > limitations by catching alignment faults and building your desired
> > results from combining two aligned reads/writes, and some compilers can
> > do the same thing in advance, such that the processor never gets to see
> > the bad access.
> >
> > The fact that the access worked for you does not necessarily mean that
> > the address is really correctly aligned.
>
> Well, this is a nice explanation, but it does not really address the
> issue I raised: Is the divisibility criterion I mentioned the right one
> for determining data alignment, or does this vary so dramatically from
> processor to processor that such criterion is not generally valid?
>
> I am aware that this is not directly related to the C standard, but it is
> a question that surely arises whenever one writes C code on any platform,
> right?
No, I would say that you are wrong. There is never any need to write
C code that accesses an lvalue via a pointer with incorrect alignment.
Most such code is written by those who decide, generally without
evidence or testing, that doing things properly is "too slow".
Almost all such decisions are based on incorrect assumptions
(premature optimization and all that) that would turn out to be just
plain wrong if actually measured or tested.
--
Jack Klein
Home:
http://JK-Technology.Com
FAQs for
comp.lang.c
http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++
http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html