Categories
alignment memory memory-alignment

Purpose of memory alignment

253

Admittedly I don’t get it. Say you have a memory with a memory word of length of 1 byte. Why can’t you access a 4 byte long variable in a single memory access on an unaligned address(i.e. not divisible by 4), as it’s the case with aligned addresses?

5

76

It’s a limitation of many underlying processors. It can usually be worked around by doing 4 inefficient single byte fetches rather than one efficient word fetch, but many language specifiers decided it would be easier just to outlaw them and force everything to be aligned.

There is much more information in this link that the OP discovered.

1

  • Thanks, @AveMilia, I’ve updated the answer.

    Mar 9, 2021 at 21:56

76

It’s a limitation of many underlying processors. It can usually be worked around by doing 4 inefficient single byte fetches rather than one efficient word fetch, but many language specifiers decided it would be easier just to outlaw them and force everything to be aligned.

There is much more information in this link that the OP discovered.

1

  • Thanks, @AveMilia, I’ve updated the answer.

    Mar 9, 2021 at 21:56

28

you can with some processors (the nehalem can do this), but previously all memory access was aligned on a 64-bit (or 32-bit) line, because the bus is 64 bits wide, you had to fetch 64 bit at a time, and it was significantly easier to fetch these in aligned ‘chunks’ of 64 bits.

So, if you wanted to get a single byte, you fetched the 64-bit chunk and then masked off the bits you didn’t want. Easy and fast if your byte was at the right end, but if it was in the middle of that 64-bit chunk, you’d have to mask off the unwanted bits and then shift the data over to the right place. Worse, if you wanted a 2 byte variable, but that was split across 2 chunks, then that required double the required memory accesses.

So, as everyone thinks memory is cheap, they just made the compiler align the data on the processor’s chunk sizes so your code runs faster and more efficiently at the cost of wasted memory.