Zazwyczaj reprezentacja tych dwóch struktur byłaby dokładnie taka sama. Możliwe jest jednak uzyskanie niskiej wydajności po wybraniu niewłaściwego dla Twojego przypadku użycia.
Na przykład, jeśli chcesz mieć dostęp do każdego elementu w pętli, z tablicy można zrobić:
for (int i = 0; i < 3; i++)
dosomething(xvec[i]);
Jednak bez tablicy, to że albo trzeba powielać kod:
dosomething(x);
dosomething(y);
dosomething(z);
Oznacza to, że powielanie kodu - które może iść w obie strony. Z jednej strony jest mniej kodu pętli; z drugiej strony bardzo ciasne pętle mogą być dość szybkie na nowoczesnych procesorach, a powielanie kodu może zdmuchnąć I-cache.
Innym rozwiązaniem jest przełącznik:
for (int i = 0; i < 3; i++) {
int *r;
switch(i) {
case 0: r = &x; break;
case 1: r = &y; break;
case 1: r = &z; break;
}
dosomething(*r); // assume this is some big inlined code
}
ten sposób unika się możliwie duży-i-cache ślad, ale ma ogromny negatywny wpływ na wydajność. Nie rób tego.
Z drugiej strony, jest w zasadzie możliwe, tablica dostępu do być wolniejszy, jeśli kompilator nie jest bardzo inteligentny:
xvec[0] = xvec[1] + 1;
dosomething(xvec[1]);
Od xvec [0] i xvec [1] są odrębny, co do zasady, kompilator powinien mieć możliwość zachowania wartości xvec [1] w rejestrze, więc nie musi przeładowywać wartości w następnym wierszu. Jest jednak możliwe, że niektóre kompilatory mogą nie być wystarczająco inteligentne, aby zauważyć, że xvec [0] i xvec [1] nie mają aliasu. W takim przypadku użycie oddzielnych pól może być bardzo małe.
W skrócie, nie chodzi o to, że jedna z nich jest szybka we wszystkich przypadkach. Chodzi o dopasowanie reprezentacji do tego, jak z niej korzystasz.
Osobiście proponuję pójść z tym, co sprawia, że kod działający na Xvec jest najbardziej naturalny. Nie warto poświęcać dużo czasu ludzkiemu na martwienie się czymś, co w najlepszym przypadku spowoduje tylko tak małą różnicę wydajności, że złapiesz ją tylko w mikro-benchmarkach.
tablice umożliwiają iterację na ich wartościach, co nie jest możliwe w przypadku korzystania z indywidualnych elementów. – Christoph
Zawsze, gdy masz pytanie dotyczące wydajności/wydajności, napisz małą aplikację testową i porównaj. Jeśli masz problemy z interpretacją wyników, zadaj pytanie. –