They will not necessarily be contiguous in memory. This is due to struct padding.
However, in your particular case, it may very well be contiguous. But if you changed the order to something like this:
struct test
{
char gender;
int age;
double height;
}
then they most likely will not be. However, in your particular case, you will still likely get padding after gender
, to realign the struct to 8 bytes.
The difference between SoA (Struct of Arrays) and AoS (Array of Structs) would be like this:
SoA:
-----------------------------------------------------------------------------------
| double | double | double | *pad* | int | int | int | *pad* | char | char | char |
-----------------------------------------------------------------------------------
AoS:
-----------------------------------------------------------------------------------
| double | int | char | *pad* | double | int | char | *pad* | double | int | char |
-----------------------------------------------------------------------------------
Note that AoS pads within each struct. While SoA pads between the arrays.
These have the following trade-offs:
- AoS tends to be more readable to the programmer as each "object" is kept together.
- AoS may have better cache locality if all the members of the struct are accessed together.
- SoA could potentially be more efficient since grouping same datatypes together sometimes exposes vectorization.
- In many cases SoA uses less memory because padding is only between arrays rather than between every struct.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…