为什么只有静态成员函数才能作为回调函数?
静态 函数 为什么 作为 成员 回调 才能 只有
2023-09-14 09:10:45 时间
隐藏的this指针
对于非静态成员函数来说,它携带了一个隐藏的”this”指针,这导致它不能满足Win32回调函数签名的要求,这样的结果就是:一个非静态成员函数,不能作为一个合法的Win32回调函数。
幸运的是,几乎所有的回调函数都提供了一些方法来感知调用上下文。你可以将这个”this”指针作为一个上下文环境来重构代码,下面是一个例子:
有一些回调函数签名将它的第一个参数作为指示上下文的参数(也叫做”引用数据”)。凑巧的是,这个隐藏的”this”指针也正好是第一个参数。回顾我们之前关于调用约定的文章,可以知道对于成员函数的__stdcall调用约定也刚好匹配我们预期的栈布局。下面我们看一个WAITFORTIMERCALLBACK的例子:
请注意:”thiscall”调用约定不能匹配上面的场景,但是两个”__stdcall”却可以。幸运的是,编译器足够聪明,它能识别这个this指针,并对上面的静态成员函数s_ThreadProc进行优化。
如果你有机会观察一下编译器为s_ThreadProc生成的汇编代码,则你会发现:函数的实现实际上就是一个跳转指令&#
相关文章
- 静态代理——时间都去哪儿了
- centos环境更换IP地址为静态并且正常联网
- Golang框架Gin入门实战--(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下)
- Spring MVC框架:第五章:静态资源访问与mvc:view-controller
- 通过HTML和CSS设计一个静态网页(练习实例,附完整代码)
- 静态代理和动态代理详解[通俗易懂]
- 【Android 逆向】Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )
- 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )
- Java静态代码块、构造代码块、构造函数详解编程语言
- C++静态成员函数(无师自通)
- JS Object对象的静态函数
- 分配Linux静态地址分配指南(linux静态地址)
- 使用Linux动态库和静态库的优缺点分析(linux动态库静态库)
- 深度探索Linux下的静态库与动态库(linux静态库与动态库)
- 1张GPU就能让静态图片变gif
- 如何重启静态的Redis服务器(如何重启静态的redis)
- 用PHP制作静态网站的模板框架(二)
- php页码形式分页函数支持静态化地址及ajax分页