免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6221 | 回复: 12
打印 上一主题 下一主题

类成员函数的第一个参数都是this,但是我却没法取出它的地址啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-20 10:43 |只看该作者 |倒序浏览
5可用积分
我知道C++把类的成员函数作为类函数的第一个参数,隐藏了。
但是我想通过强制转型把它取出来,发现不行。
例如下面这个代码:

  1. struct s{
  2.     int i;
  3.     s():i(123){}
  4.     void f(int k){      // 既然k是第二个参数,this是第一个参数,我期望强转k的地址基础上减去1个指针大小,就是this
  5.         s** pps=(s**)&k; // 我把函数的参数列表看成是s*的数组
  6.         s*  ps =pps[-1];
  7.         cout<<"getaddress"<<endl;
  8.         cout<<ps->i<<endl;
  9.         cout<<this-pps[-1]<<endl;//检验是不是this指针参数紧贴着函数的第二个参数,预期的结果是sizeof(size_t)
  10.     }
  11. }o1;
  12. int main(void){
  13.     o1.f(22);
  14. }
复制代码
VC2010在32位xp上面打印了getaddress以后就崩溃了。GCc也是core dump。
为什么呢?

最佳答案

查看完整内容

谁告诉你C++成员函数的参数一定是存在memory里面的,就不能存在register里面么。。。事实上,几乎所有的C++编译器都是把this指针放在register里面的。在x86架构下一般是ECXC++程序员还是得多学学计算机组成原理啊

论坛徽章:
0
2 [报告]
发表于 2012-04-20 10:43 |只看该作者
谁告诉你C++成员函数的参数一定是存在memory里面的,就不能存在register里面么。。。
事实上,几乎所有的C++编译器都是把this指针放在register里面的。在x86架构下一般是ECX
C++程序员还是得多学学计算机组成原理啊

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2012-04-20 10:55 |只看该作者
LZ你又来了……  你要学会用C/C++规定的方式去表达你的意图……  而不是自己创造意图,并期待编译器能理解……

>> 既然k是第二个参数,this是第一个参数,我期望强转k的地址基础上减去1个指针大小,就是this
this的传递有可能连栈都不使用(VC有thiscall,i386下用ecx)。

在非静态成员函数里,想获取this,直接用this关键字……

论坛徽章:
0
4 [报告]
发表于 2012-04-20 11:05 |只看该作者
OwnWaterloo 发表于 2012-04-20 10:55
LZ你又来了……  你要学会用C/C++规定的方式去表达你的意图……  而不是自己创造意图,并期待编译器能理解… ...


我知道C++里面应该用this。
我问这个问题的原因是我最近在研究thunk技术,这是个vc的atl库里面的常用技术。

所以我想验证一下,VC/GCC的实现里面,this指针到底是不是类成员的第一个参数。我不知道我的代码问题在哪里?
既然thunk技术是通过偏移命令取出this指针的内容,那么我的代码如何修改才能工作么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2012-04-20 11:29 |只看该作者
回复 3# zuiwei

s_f(s* self, int k) { return self->f(k); }
去thunk这个函数吧,比直接在s :: f 上搞要好得多。

论坛徽章:
0
6 [报告]
发表于 2012-04-20 11:52 |只看该作者
OwnWaterloo 发表于 2012-04-20 11:29
回复 3# zuiwei

s_f(s* self, int k) { return self->f(k); }


你说的去thunk这个函数,能具体一点么?
谢谢。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2012-04-20 11:57 |只看该作者
回复 5# zuiwei

s_f(s* self, int k), plain C function, 它的调用约定虽然C也没有规定, 但比s :: f(int k), non-static member function, 要稳定得多。
后者会被许多因素影响。

论坛徽章:
0
8 [报告]
发表于 2012-04-20 13:05 |只看该作者
OwnWaterloo 发表于 2012-04-20 11:57
回复 5# zuiwei

s_f(s* self, int k), plain C function, 它的调用约定虽然C也没有规定, 但比s :: f(i ...


说的粉有道理

论坛徽章:
0
9 [报告]
发表于 2012-04-20 13:21 |只看该作者
本帖最后由 x5miao 于 2012-04-20 13:22 编辑

回复 8# zuiwei


    好好看书,问这种问题也不怕被人笑话。

有些人就感觉不到耻辱吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2012-04-20 13:33 |只看该作者
marxn 发表于 2012-04-20 10:43
谁告诉你C++成员函数的参数一定是存在memory里面的,就不能存在register里面么。。。
事实上,几乎所有的C++编译器都是把this指针放在register里面的。在x86架构下一般是ECX
C++程序员还是得多学学计算机组成原理啊


本来打算睁一只眼闭一只眼的……
但既然被选作最佳答案了,就不得不提一下:


>> 事实上,几乎所有的C++编译器都是把this指针放在register里面的。在x86架构下一般是ECX
不是所有,gcc与clang在i386下都都是用栈传递的。
即使用ecx传递的msvc,也支持thiscall之外的stdcall与cdecl调用约定。后两者都是通过栈传递。对代码中没有显式制定调用约定的,还可以通过编译选项控制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP