Re: Architectures where unaligned access is (not) OK?
Usually when you're loading an unaligned value you're also loading a
particular representation and endianness, which might not be the
native one, so I've often written code like this:
uint32_t load32(void *p)
{
unsigned char *c = p;
return
c[0] | (uint32_t)c[1] << 8 | (uint32_t)c[2] << 16 | (uint32_t)c[3] << 24;
}
(The first of the three casts isn't really necessary ...)
Unfortunately, GCC doesn't seem to turn that into a single load
instruction even when it could be. (Why not?)
If you know that you want the native representation and endianness
there's this possibility:
uint32_t load32(void *p)
{
uint32_t r;
memcpy(&r, p, sizeof(r));
return r;
}
GCC turns that into a single load instruction on i386, amd64 and arm64.
Edmund
Reply to: