S[2] s2; // array of two structs, plus a length?
Storing length is not needed for static arrays because it is known, well, statically.
I tested some prime sieves both in C++ and D. They worked fastest with dynamic arrays with a size matching the L1 cache. I presume the instructions are located elsewhere in the CPU.
Yes, instruction cache is completely separated from data cache.