请问对象的非虚函数地址在哪,用指针怎么调用?

RiKaA 2013-10-19 11:23:51
class Cpersons{
public:
int len;
int max;
Cpersons(){
max=40;
len=0;
p=new Cperson[40];
}
~Cpersons(){
delete[] p;
len=0;
max=0;
}
void out(){ cout<<"out"<<endl;}
}
Cpersons per;
然后直接用指针调用 out;
...全文
287 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
RiKaA 2013-10-21
  • 打赏
  • 举报
回复
引用 19 楼 lm_whales 的回复:
非虚成员函数地址,地址在代码里,和编译器的符号表里,编译器找到他们, 安排参数传递代码,包括传递隐藏参数 this 指针的代码,然后就是 一条call 指令. 调用对应的函数. 是直接安排调用代码,不需要额外的代码,来通过函数指针调用. 汇编对应的指令大约如下:
#include<iostream>
using namespace std;
class A{
int x;
public:
    A():x(10){};
    void print(int n){cout<<"A::print n = "<<n<<", x = "<< x <<endl;};
}
a.print();
  //1)  push n
  //2)  lea ecx,a ;//this 指针。
  //3)  call A::print
PS: 非虚成员函数,编译器,直接安排调用指令.没有多少技巧可言.
好 你赢了 结贴
lm_whales 2013-10-20
  • 打赏
  • 举报
回复
非虚成员函数地址,地址在代码里,和编译器的符号表里,编译器找到他们, 安排参数传递代码,包括传递隐藏参数 this 指针的代码,然后就是 一条call 指令. 调用对应的函数. 是直接安排调用代码,不需要额外的代码,来通过函数指针调用. 汇编对应的指令大约如下:
#include<iostream>
using namespace std;
class A{
int x;
public:
    A():x(10){};
    void print(int n){cout<<"A::print n = "<<n<<", x = "<< x <<endl;};
}
a.print();
  //1)  push n
  //2)  lea ecx,a ;//this 指针。
  //3)  call A::print
PS: 非虚成员函数,编译器,直接安排调用指令.没有多少技巧可言.
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
上面打错了。是: 虚函数在物理上也是在编译是就确定地址,只是不同派生类,虚表的函数指针填充不同的值
我指的是调用时...虚函数是间接调用的
worldy 2013-10-19
  • 打赏
  • 举报
回复
上面打错了。是: 虚函数在物理上也是在编译是就确定地址,只是不同派生类,虚表的函数指针填充不同的值
worldy 2013-10-19
  • 打赏
  • 举报
回复
引用 11 楼 wangdahu888 的回复:
非虚函数地址,在编译时就已经确定了,会根据你的调用,直接填充函数地址,
非虚函数在物理上也是在编译是就确定地址,只是不同派生类,虚表的函数指针填充不同的值
  • 打赏
  • 举报
回复
非虚函数地址,在编译时就已经确定了,会根据你的调用,直接填充函数地址,
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
在类成员内,定义一个函数指针,让函数指针等于函数明,就能得到地址
能成功么,我没能办到。。
worldy 2013-10-19
  • 打赏
  • 举报
回复
在内存位置很简单, 在类成员内,定义一个函数指针,让函数指针等于函数明,就能得到地址
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
在某个位置
虚函数表的地址就在对象地址头上、这好办 但是我想找非虚函数。
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
标准没说,只能看汇编了。
的确找遍资料都没说、网上说是生成对象是函数指针并不是放在对象内存里的、放在了全局。 继续坐等明白人。
worldy 2013-10-19
  • 打赏
  • 举报
回复
class a { virtual int aFun(...){...}; .... } int (*TheFun)(....); 在某个位置: TheFun=a::aFun;//这样应该行 TheFun=&(this->aFun);//不知道行不行
ri_aje 2013-10-19
  • 打赏
  • 举报
回复
标准没说,只能看汇编了。
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
你这样搞还有尽头?
那个不重要,我想了解非虚函数在对象里的内存位置。
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
啥意思?这么调用不就行了吗。
我想了解非虚函数在对象里的内存位置。
nightkids_008 2013-10-19
  • 打赏
  • 举报
回复
Cpersons(){ max=40; len=0; p=new Cperson[40]; 你这样搞还有尽头?
ri_aje 2013-10-19
  • 打赏
  • 举报
回复
啥意思?这么调用不就行了吗。

Cpersons per;
per.out();
(&per)->out();
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用 17 楼 BruceXiaotao 的回复:
相当于全局函数! 只不过参数有个this指针
有例子可以参考一下吗?
BruceXiaotao 2013-10-19
  • 打赏
  • 举报
回复
相当于全局函数! 只不过参数有个this指针
RiKaA 2013-10-19
  • 打赏
  • 举报
回复
引用
非虚函数不需要在对象内存中存储其地址
那它在哪 用指针怎么直接调用啊?
baichi4141 2013-10-19
  • 打赏
  • 举报
回复
非虚函数不需要在对象内存中存储其地址

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧