【问题标题】:Is it a good practice to repeatedly use struct in C?在 C 中重复使用 struct 是一种好习惯吗?
【发布时间】:2019-03-11 05:10:30
【问题描述】:

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

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 上循环了很多次,在这里使用临时变量会更快/更好吗?

C 语言在性能方面有什么不同吗?

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

【问题讨论】:

  • 编译器会自己优化。
  • 您是否有任何来自分析器的信息表明您当前的代码存在瓶颈?如果没有,那就不用担心了。过早的优化是浪费时间。
  • @Sedmaister 那么您的努力可能最好花在将现代优化编译器添加到您的工具链中,而不是自己进行这些优化。如果您想知道它是否更快,为什么不直接运行您的代码并进行测量?
  • 如果您的编译器没有对此进行优化,则使用 temp 变量会更快。但在你的情况下,printf 的开销无论如何都会大得多,所以它不会产生任何明显的区别。
  • 谁投票决定关闭这个?这实际上是一个相当深的 C 问题。 “坏”这个词可能选得不好,但可以用恰当的方式加以澄清。

标签: c performance struct


【解决方案1】:

这不是,但它可能是优化瓶颈的来源。因为编译器看不到外部函数的定义(比如这里的printf,尽管它可能知道它作为内置函数的属性,因为它是一个标准函数),它必须假设任何外部函数都可以修改任何非const 对象,其地址它可以看到。因此,在您的示例中,nodenode-&gt;sec_node 在调用外部函数之前和之后可能具有不同的值。

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

【讨论】:

  • 你写的只是因为OP使用全局变量是他们的实例,局部变量可能会遇到同样的问题吗?
  • @doron:是的。常见的情况是指向结构的指针是你的函数的参数,你的函数是外部的,并且可能是从另一个翻译单元调用的。在这种情况下,编译器无法知道其他外部函数是否可以看到指向的对象,并且必须假设它们可以。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2013-08-03
  • 1970-01-01
  • 2011-08-30
  • 2019-03-06
相关资源
最近更新 更多