访问结构中的字段需要更多时间吗?

时间:2014-10-22 18:06:16

标签: c struct

访问结构深处的字段是否需要额外的时间(汇编指令),还是编译器对这些内存位置进行硬编码?我想在逻辑上把某些东西放在一个结构中,但是想知道我是否因为它而受到性能影响。

例如,在以下代码中,写入s.c.d的速度是否慢于写入d2

typedef struct a_struct_tag {
  uint8_t d;
} a_struct_t;

typedef struct my_struct_tag {
  uint8_t    a;
  uint8_t    b[8];
  a_struct_t c;
} my_struct_t;

int main()
{
 my_struct_t s;
 s.c.d = 3;

 a_struct_t d2;
 d2.d = 4;
}

1 个答案:

答案 0 :(得分:3)

没有区别。我们来看看objdump -S binary的一些汇编输出:

int main()
{
  40053c:       55                      push   %rbp
  40053d:       48 89 e5                mov    %rsp,%rbp
  400540:       48 83 ec 30             sub    $0x30,%rsp
  400544:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
  40054b:       00 00 
  40054d:       48 89 45 f8             mov    %rax,-0x8(%rbp)
  400551:       31 c0                   xor    %eax,%eax
my_struct_t s;
s.c.d = 3;
  400553:       c6 45 e9 03             movb   $0x3,-0x17(%rbp)

a_struct_t d2;
d2.d = 4;
  400557:       c6 45 df 04             movb   $0x4,-0x21(%rbp)
}
 .... //the rest is not interesting, or at least I believe so

现在我不是x86汇编的专家,但我们可以清楚地看到,这两个命令只有一条指令。

为什么会这样?如果你有一个结构,根据它的大小明确定义,那么在编译过程中可以计算每个偏移量。现在它只是“将值X放在存储单元Y中”。

嵌套水平并不重要。

关于性能调整的一般准则,让我引用Donald Knuth:

  

过早优化是万恶之源。

更好地调整算法和IO,而不是担心编译器的工作。编译器可以在优化方面做出奇迹(字面意思!),如果你允许它使用某些编译标志。