Because C almost prescribes a layout of memory (structs and arrays), this prevents compilers from doing some useful optimizations.
- Compilers are prohibited to reorder struct fields. Field reordering might decrease required padding and struct size, so less memory is used and more values fit in one cache line, etc.
- Compilers cannot replace an array of structs with a struct of arrays. This optimizations might improve cache locality or might allow vectorized instructions. It might also eliminate padding.