Они не обязательно будут смежными в памяти.Это происходит из-за struct padding .
Однако, в вашем конкретном случае, он вполне может быть смежным.Но если вы изменили порядок на что-то вроде этого:
struct test
{
char gender;
int age;
double height;
}
, то, скорее всего, не будет.Тем не менее, в вашем конкретном случае вы, вероятно, все равно получите заполнение после gender
, чтобы выровнять структуру до 8 байт.
Разница между SoA ( Struct of Arrays )и AoS ( массив структур ) будет выглядеть следующим образом:
SoA:
-----------------------------------------------------------------------------------
| double | double | double | *pad* | int | int | int | *pad* | char | char | char |
-----------------------------------------------------------------------------------
AoS:
-----------------------------------------------------------------------------------
| double | int | char | *pad* | double | int | char | *pad* | double | int | char |
-----------------------------------------------------------------------------------
Обратите внимание, что панели AoS внутри каждой структуры.Хотя площадки SoA между массивами.
Они имеют следующие компромиссы:
- AoS , как правило, более читабельны дляпрограммист, так как каждый «объект» хранится вместе.
- AoS может иметь лучшую локальность кэша, если все члены структуры доступны вместе.
- SoA потенциально может быть более эффективным, поскольку группирование одних и тех же типов данных иногда приводит к векторизации.
- Во многих случаях SoA использует меньше памяти, потому что заполнение происходит только между массивами, а не между каждой структурой.