Как правило, представление этих двух структур будет точно таким же. Однако возможно снижение производительности, если вы выберете неправильный для своего варианта использования .
Например, если вам нужен доступ к каждому элементу в цикле, вы можете использовать массив:
for (int i = 0; i < 3; i++)
dosomething(xvec[i]);
Однако без массива вам потребуется дублировать код:
dosomething(x);
dosomething(y);
dosomething(z);
Это означает дублирование кода, которое может быть любым. С одной стороны, там меньше кода цикла; с другой стороны, на современных процессорах очень короткие циклы могут быть довольно быстрыми, а дублирование кода может разрушить I-кеш.
Другой вариант - это переключатель:
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
}
Это позволяет избежать, возможно, большого использования i-cache, но оказывает огромное негативное влияние на производительность. Не делай этого.
С другой стороны, в принципе, доступ к массиву может быть медленнее, если ваш компилятор не очень умен:
xvec[0] = xvec[1] + 1;
dosomething(xvec[1]);
Поскольку xvec [0] и xvec [1] различаются, в принципе, компилятор должен иметь возможность сохранять значение xvec [1] в регистре, поэтому он не должен перезагружать значение в следующая строка Однако возможно, что некоторые компиляторы не будут достаточно умны, чтобы заметить, что xvec [0] и xvec [1] не имеют псевдонимов. В этом случае использование отдельных полей может быть немного быстрее.
Короче говоря, речь идет не о том, что один или другой быстры во всех случаях. Речь идет о сопоставлении представления с тем, как вы его используете.
Лично я бы предложил использовать то, что делает код, работающий на xvec, наиболее естественным. Не стоит тратить много человеческого времени на то, чтобы беспокоиться о том, что в лучшем случае, вероятно, приведет только к такой небольшой разнице в производительности, что вы поймете это только в микропробежках.