假设我具有来自不同头文件的这两个结构:
header_1.h
struct main_node {
struct *sec_node
}
header_2.h
struct sec_node {
int var;
}
现在我正在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) ;
}
让我们假设,我没有使用现代的优化编译器。我多次遍历此struct
,在这里使用temp变量会更快/更好吗?
C语言在性能方面是否有差异?
void main()
{
int temp = node->sec_node->var;
for (int i = 0; i < 1000; i++)
printf( "%d\n", temp);
}
答案 0 :(得分:4)
这不是坏,但它可能是优化瓶颈的来源。因为编译器看不到外部函数的定义(例如printf
,尽管它可能因为标准函数而知道其内建属性),所以它必须假定任何外部函数都可以修改任何非{{1 }}对象,可以看到其地址。这样,在您的示例中,const
或node
在调用外部函数前后可能具有不同的值。
减轻这种情况的一种方法是使用类似的临时操作,但是您也可以使用node->sec_node
关键字作为对编译器的承诺,即在restrict
的生存期内-限定的指针,除非通过“基于” restrict
限定的指针的指针,否则不会访问该指向的对象。如何执行此操作可能不在此问题的范围内。