ZhiBing's blog(码上看世界) ZhiBing's blog(码上看世界)
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

ZhiBing Zheng

时间会回答成长
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • 编程语言

  • 调试

  • 开发者测试

  • 系统支撑

  • 性能优化

    • 编译优化选项

    • perf

    • valgrind

    • 实用小技巧

      • 函数入参类型选择
        • 参考
  • 通用领域
  • 性能优化
  • 实用小技巧
zhengzhibing
2024-01-16
目录

函数入参类型选择

# 函数入参类型选择

计算机在处理符合指令集架构寄存器位宽的类型时,处理效率更高。

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

这两个函数仅仅是入参类型不相同。我们看一下他们的汇编。

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
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

从这两段汇编上看,就能看出非32位或64位的整形入参,在压栈和运行过程中执行的指令比32位或64位的要多。

# 参考

  • [X86寄存器相关](x86寄存器问题_rax rbx rcx rdx-CSDN博客 (opens new window))
上次更新: 2024/01/16, 22:32:53
Valgrind

← Valgrind

最近更新
01
HPE gen10 plus 安装ESXI 7
06-12
02
ESXI 7安装黑群晖
06-12
03
ESXI 7安装win10
06-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 ZhBing Zheng | 粤ICP备2022062743号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式