Mam strukturę, która wygląda tak:najszybsze Struct-of-tablic do Array-of-kodowanym Conversion
struct SoA
{
int arr1[COUNT];
int arr2[COUNT];
};
I chcę, żeby wyglądać tak:
struct AoS
{
int arr1_data;
int arr2_data;
};
std::vector<AoS> points;
jako tak szybko jak to możliwe. Zamówienie musi zostać zachowane.
Konstruuje każdy obiekt AoS
indywidualnie i przesyła go z powrotem w najszybszy sposób, aby to zrobić, czy jest szybsza opcja?
SoA before;
std::vector<AoS> after;
for (int i = 0; i < COUNT; i++)
points.push_back(AoS(after.arr1[i], after.arr2[i]));
Istnieją pytania związane z SoA/AoS dotyczące StackOverflow, ale nie znalazłem jednego związanego z najszybszą możliwą konwersją. Ze względu na różnice w strukturze pakietów nie widzę sposobu, aby uniknąć kopiowania danych z jednego formatu do drugiego, ale mam nadzieję, że ktoś może mi powiedzieć, że istnieje sposób na proste odwoływanie się do danych i unikanie kopii.
Niezwykle zachęcające rozwiązania ścienne.
Wątpię, czy możesz "po prostu inaczej odnieść się do danych", ponieważ ma on inne ustawienie w pamięci. – immibis
I będziesz musiał włożyć/wepchnąć je mimo to, w przeciwnym razie twój "wektor" nie będzie w prawidłowym stanie. –
Należy zauważyć, że odwoływanie się do danych w inny sposób może nie być rzeczywiście szybsze niż wykonanie kopii ... Pamięć podręczna RAM jest najbardziej efektywna podczas odczytu lub zapisu pamięci liniowo, a wykonanie wielu dereferencji może spowodować jej przerwanie, powodując wiele braków w pamięci podręcznej. i dlatego wolniejsze wykonanie. (a może nie, ale najważniejszą rzeczą jest zmierzenie go w obie strony i przygotuj się na zaskoczenie, gdy twoje intuicje nie pasują do rzeczywistości). –