函数入参类型选择
# 函数入参类型选择
计算机在处理符合指令集架构寄存器位宽的类型时,处理效率更高。
uint64_t FuncInputParam32(uint32_t a, uint64_t b)
{
uint64_t c = a + b;
return c;
}
uint64_t FuncInputParam16(uint8_t a, uint16_t b)
{
uint64_t c = a + b;
return c;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这两个函数仅仅是入参类型不相同。我们看一下他们的汇编。
Dump of assembler code for function FuncInputParam32(unsigned int, unsigned long):
0x0000555555563d0a <+0>: endbr64
0x0000555555563d0e <+4>: push %rbp
0x0000555555563d0f <+5>: mov %rsp,%rbp
0x0000555555563d12 <+8>: mov %edi,-0x14(%rbp) ; 入参a压栈
0x0000555555563d15 <+11>: mov %rsi,-0x20(%rbp) ; 入参b压栈
0x0000555555563d19 <+15>: mov -0x14(%rbp),%edx ; 写入32位寄存器
0x0000555555563d1c <+18>: mov -0x20(%rbp),%rax ; 写入64位寄存器
0x0000555555563d20 <+22>: add %rdx,%rax ; edx是rdx的低32位
0x0000555555563d23 <+25>: mov %rax,-0x8(%rbp)
0x0000555555563d27 <+29>: mov -0x8(%rbp),%rax
0x0000555555563d2b <+33>: pop %rbp
0x0000555555563d2c <+34>: retq
End of assembler dump.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Dump of assembler code for function FuncInputParam16(unsigned char, unsigned short):
0x0000555555563d2d <+0>: endbr64
0x0000555555563d31 <+4>: push %rbp
0x0000555555563d32 <+5>: mov %rsp,%rbp
0x0000555555563d35 <+8>: mov %edi,%edx
0x0000555555563d37 <+10>: mov %esi,%eax
0x0000555555563d39 <+12>: mov %dl,-0x14(%rbp) ; 入参a压栈
0x0000555555563d3c <+15>: mov %ax,-0x18(%rbp) ; 入参b压栈
0x0000555555563d40 <+19>: movzbl -0x14(%rbp),%edx
0x0000555555563d44 <+23>: movzwl -0x18(%rbp),%eax
0x0000555555563d48 <+27>: add %edx,%eax ; 32位寄存器运算
0x0000555555563d4a <+29>: cltq
0x0000555555563d4c <+31>: mov %rax,-0x8(%rbp)
0x0000555555563d50 <+35>: mov -0x8(%rbp),%rax
0x0000555555563d54 <+39>: pop %rbp
0x0000555555563d55 <+40>: retq
End of assembler dump.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
从这两段汇编上看,就能看出非32位或64位的整形入参,在压栈和运行过程中执行的指令比32位或64位的要多。
# 参考
上次更新: 2024/01/16, 22:32:53