通常,这两个结构的表示将完全相同。但是,如果您为自己的用例选择了错误的选项,则可能会导致性能不佳。
例如,如果您需要访问循环中的每个元素,您可以使用数组执行以下操作:
for (int i = 0; i < 3; i++)
dosomething(xvec[i]);
但是,如果没有数组,您要么需要复制代码:
dosomething(x);
dosomething(y);
dosomething(z);
这意味着代码重复——这两种方式都可以。一方面循环代码更少;另一方面,非常紧凑的循环在现代处理器上可能会非常快,并且代码重复会破坏 I-cache。
另一个选项是开关:
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 上工作的代码最自然的方法。不值得花费大量时间来担心某些事情,充其量只会产生如此小的性能差异,以至于您只能在微基准测试中发现它。