在C中重复使用struct是一个好习惯吗?

Sed*_*ter 7 c performance struct

假设我有两个结构来自不同的头文件:

header_1.h

struct main_node {
    struct *sec_node
}
Run Code Online (Sandbox Code Playgroud)

header_2.h

struct sec_node {
    int var;
}
Run Code Online (Sandbox Code Playgroud)

现在我使用这两个头文件,main.c代码看起来像这样:

#include <stdio.h>
#include "header_1.h"
#include "header_2.h"

struct main_node *node;

void main()
{
  for (int i = 0; i < 1000; i++)
      printf( "%d\n", node->sec_node->var) ;
}
Run Code Online (Sandbox Code Playgroud)

我们假设,我没有使用现代优化编译器.我循环了struct很多次,在这里使用临时变量会更快/更好吗?

在C中,性能方面有什么不同吗?

void main()
{
   int temp = node->sec_node->var;
   for (int i = 0; i < 1000; i++)
      printf( "%d\n", temp);
}
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 4

这还不错,但它可能成为优化瓶颈的根源。因为编译器无法看到外部函数的定义(就像printf这里一样,尽管它可能知道其作为内置函数的属性,因为它是标准函数),所以它必须假设任何外部函数都可以修改const其地址可以看到的任何非对象。因此,在您的示例中,nodeornode->sec_node可能在调用外部函数之前和之后具有不同的值。

缓解这种情况的一种方法是像您一样使用临时变量,但您也可以使用该关键字restrict作为对编译器的承诺,即在 -qualified 指针的生命周期内restrict,不会访问所指向的对象,除非通过“基于”restrict限定指针的指针。如何做到这一点可能超出了这个问题的范围。