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)
  • 编程语言

    • C++

      • shared_ptr(智能指针)
      • unique_ptr
      • bind函数
      • cout
      • C++ main函数的传入参数(argc, argv)
      • GLog使用
      • signals2
      • 编译期分派
      • 成员函数的调用效率
      • 返回值优化
      • 函数调用栈
      • 空类大小
      • 指针和数组的区别
      • 遵守三五原则
      • const限定符
      • static限定符
      • virtual限定符
      • 常用的CXX_FLAGS
      • 模版之AnyType
      • 模版之编译期断言
      • 模版之变参模板
    • Go

    • Python

    • shell

    • Rust

  • 调试

  • 开发者测试

  • 系统支撑

  • 性能优化

  • 通用领域
  • 编程语言
  • C++
zhengzhibing
2022-06-16

成员函数的调用效率

# 成员函数的调用效率

C++成员函数的调用和普通函数调用有相同的效率。

C++的设计准则之一就是:非静态成员函数至少必须和一般的非成员函数有相同的效率。

也就是说,使用成员函数不会带来额外的负担。

编译器内部已经将成员函数实例转化成了对等的非成员函数实例。这个过程就涉及到了this 指针。

成员函数实例转化成了对等的非成员函数实例步骤:

  1. 改变函数签名,增加一个额外的形参,用于提供一个存取的管道,使得类的对象能够调用此函数,这个额外的形参就是this 指针。这里不得不提到一点,成员函数被放置到类对象空间之外,只有一份,那么不同对象调用成员函数就是利用了这个this 指针:
void Person::SetAge(int age);
// 将成员函数实例转化成了对等的非成员函数实例,如下:
void Person::SetAge(Person* const this, int age);
1
2
3
  1. 对每个非静态成员函数的存取操作都是通过 this 指针来完成的。
  2. 编译器对函数进行符号修饰,使得这个函数名称独一无二。
// 通过nm工具查看符号表
_ZN6Person6SetAgeEi
1
2
obj.SetAge(5);
1

转换成:

_ZN6Person6SetAgeEi(&obj, 5);
1

在实际成员函数的调用栈中,我们也会发现 this 指针的存在,this 指针通常是作为第一个函数参数。

#C++
上次更新: 2022/06/17, 07:22:19
编译期分派
返回值优化

← 编译期分派 返回值优化→

最近更新
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号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式