gpt4 book ai didi

c - 何时(不)将嵌套数据结构的一部分存储到临时变量中——漂亮/丑陋,更快/更慢?

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:06 25 4
gpt4 key购买 nike

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

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

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]++;

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

最佳答案

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

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

  • 当一个可以给它命名时,它的名字不言自明并且比最初的表达更能说明问题,或者
  • 如果我必须将某段代码重复至少三次

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

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]++;
// ...

关于c - 何时(不)将嵌套数据结构的一部分存储到临时变量中——漂亮/丑陋,更快/更慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com