Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why favour data structure alignment?

Tags:

c++

c

memory

struct

The type of each member of the structure usually has a default alignment i.e.each structure member is aligned on a pre-determined boundary. For this reason the padding is performed in the following wiki example:

struct MixedData
{
    char Data1;
    short Data2;
    int Data3;
    char Data4;
};



struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1 byte */
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */
    char Padding1[1];
    short Data2; /* 2 bytes */
    int Data3;  /* 4 bytes - largest structure member */
    char Data4; /* 1 byte */
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};

What is the (practical) reason that alignment should be preserved?

like image 877
Yakov Avatar asked Jun 19 '12 10:06

Yakov


2 Answers

Unaligned reads and writes usually require the CPU to fetch the two adjacent words from memory (instead of just one) and to apply some additional bitwise arithmetic in order to perform the designated operation properly.

Some architectures, like x86 will allow it at a performance cost. Other architectures (most notably ARM), will either raise an exception (usually resulting in a SIGBUS signal for a user process) or even "round" the address to the closest boundary which could result in some very nasty bugs.

like image 147
Blagovest Buyukliev Avatar answered Sep 24 '22 01:09

Blagovest Buyukliev


On many architectures, aligned reads and writes from and to main memory are much faster than their unaligned counterparts.

like image 36
Pedro Avatar answered Sep 22 '22 01:09

Pedro