访问结构深处的字段是否需要额外的时间(汇编指令),还是编译器对这些内存位置进行硬编码?我想在逻辑上把某些东西放在一个结构中,但是想知道我是否因为它而受到性能影响。
例如,在以下代码中,写入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;
}
答案 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,而不是担心编译器的工作。编译器可以在优化方面做出奇迹(字面意思!),如果你允许它使用某些编译标志。