Reason 1: Address calculations are faster and less.
x86, , , " ". ", " x86. :
struct s { char c[N]; };
int func(struct s *p, int i) { return p[i].c[0]; }
N 23 ( ):
leaq (%rsi,%rsi,2), %rax
salq $3, %rax
subq %rsi, %rax
movsbl (%rax,%rdi),%eax
N 24 ( ):
leaq (%rsi,%rsi,2), %rax
movsbl (%rdi,%rax,8),%eax
N 32 ( ):
salq $5, %rsi
movsbl (%rsi,%rdi),%eax
, 23- .
2:. .
, . 32- . - , . , .
unsigned char *data = ...;
header *h = (header *) data;
do_something_with(h);
uint32_t x = *(uint32_t *) (data + sizeof(header));
SPARC, sizeof(header) 4, x86 , sizeof(header) 4.