1

在一个数组/结构/联合中读取多个数字/字符串的最佳方法是什么,它本身嵌套在一个或多个父数组/结构/联合中?

第一个没有临时变量的例子:

printf("%d %d\n", a[9][3], a[9][4]);

第一个带有临时变量的示例:

int *b = a[9];
printf("%d %d\n", b[3], b[4]);

我敢肯定,上面第一个示例中的临时变量非常愚蠢,但在下面的第二个示例中,它是有意义的,并且看起来更好用,对吧?

第二个没有临时变量的例子:

foo[i]->bar.red[j][0]++;
foo[i]->bar.red[j][1]++;
foo[i]->bar.red[j][2]++;
foo[i]->bar.red[j][3]++;

带有临时变量的第二个示例:

int *p = foo[i]->bar.red[j];
p[0]++;
p[1]++;
p[2]++;
p[3]++;

那么你在哪里画线?我意识到编译器足够聪明,可以插入以这种方式产生最佳效率的程序集所需的任何间接,但是(假设假设对性能至关重要的代码)也许有例外?从代码清晰度/可维护性的角度来看,如果有的话,您的经验法则是什么?

4

3 回答 3

3

首先,我认为这纯粹是代码可读性/可维护性的问题,这是个人喜好。今天的编译器比我们聪明(笑话)。:-)

就个人而言,我通常会考虑在两种情况下提取临时变量(或函数,这也适用于它们):

  • 当 a 可以命名它以使其名称不言自明并且不仅仅说明初始表达时,或者
  • 如果我必须至少重复一段代码三遍。

因此,您的第一个示例我将保持原样:

printf("%d %d\n", a[9][3], a[9][4]);

第二个是:

int *p = foo[i]->bar.red[j];
p[0]++;
// ...

或者,(通常但不总是)更好:

int *bar_red = foo[i]->bar.red[j];
bar_red[0]++;
// ...
于 2012-01-06T03:47:18.007 回答
2

我的经验法则是:添加一个临时变量,如果你能给它一个明确的有意义的名字,让代码更容易理解。第二个建议是:将使用此变量的(小)部分括在大括号中。这样意图很明确,如果需要重构,代码几乎已经准备就绪(大括号中的代码很容易提取到函数中)。

在您的第二个示例中,这将导致:

/*previous code
...
*/
int *quadruplet = foo[i]->bar.red[j];
{ /*intentionaly meaningless braces that prepare the introduction 
  of a function (incrementQuadruplet) in a later refactoring if needed*/
  quadruplet[0]++;
  quadruplet[1]++;
  quadruplet[2]++;
  quadruplet[3]++;
}
/*following code
...
*/
于 2012-01-06T04:06:05.907 回答
1

这并不能以确切的方式回答您的问题,但我不禁强调这一点,因为这是大多数程序员经常落入的陷阱。

经验法则是:避免过早的优化。
现代编译器足够聪明,可以自行执行微不足道的优化。
编写易于理解、维护并遵循您所在团队的编码标准/实践的代码。
按照要求正确工作,分析您的代码的瓶颈,然后才尝试优化找到的代码成为瓶颈。

于 2012-01-06T03:25:04.527 回答