【发布时间】:2013-12-31 19:15:33
【问题描述】:
如果有一个函数将指向struct 的指针作为参数,并且该函数有一个在每次迭代时访问成员的循环,例如:
int function_a(struct b *b)
{
// ... do something then
for(int i = 0; i < 500; ++i){
b->c->d[i] = value();
}
}
会不会每次都从内存中检索c指向和d指向的位置?
现在考虑以下情况:
int function_a(struct b *b)
{
// ... do something then
float *f = b->c->d;
for(int i = 0; i < 500; ++i){
f[i] = value();
}
}
这样会更快吗?
【问题讨论】:
-
循环的性能很可能被
value()的性能所支配。其余的可能是过早的优化,除非您已经测量它是一种性能抑制因素。 -
@JonathanLeffler +1 提及测量。在这些情况下,它(几乎)总是更好地衡量,然后尝试推测编译器可以找出哪些优化。
-
另外,仅从维护者的角度来看,我更喜欢看到具有正确名称的局部变量而不是一长串的取消引用...
b->c->d[i]可能更容易阅读为@987654327 @. -
@MadScienceDreams,虽然写的是另一种语言,但 Shawn Hargreaves 在他的博客中给出的信息是一个很好的信息:Why Measure When You Can Guess?
-
如果您可以使指针保持不变,这也可能有助于优化器解决问题。此外,对于它的价值,在声明该类型的变量时不需要重复“struct”关键字(你在 C 中,而不是在 C++ 中)。您的参数名称与类型相同也让我感到害怕 - 但我会假设原始来源不同。