非静态的成员函数存储在什么地方?

匚匚 2011-02-13 02:32:14
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?

类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
...全文
868 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuyang120428941 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wang28103 的回复:]

加上this指针后,member function就和nonmember function同样处理了。至于如何找到函数的入口地址,从编译的角度来说就是是编译器将函数名转换成了函数的入口地址(逻辑地址)并转向此地址运行,从汇编的角度讲就是调用了一个call指令,而这个call指令的参数就是函数名对应的逻辑地址。 另外,还想说下的name mangling ,如果成员函数和外部函数重名,那么……
[/Quote]

同意这种说法!
wang28103 2011-07-07
  • 打赏
  • 举报
回复
加上this指针后,member function就和nonmember function同样处理了。至于如何找到函数的入口地址,从编译的角度来说就是是编译器将函数名转换成了函数的入口地址(逻辑地址)并转向此地址运行,从汇编的角度讲就是调用了一个call指令,而这个call指令的参数就是函数名对应的逻辑地址。 另外,还想说下的name mangling ,如果成员函数和外部函数重名,那么该怎样区别呢?C++编译器提供了name mangling(即名字改编)功能,用以实现函数独一无二的命名。这种方法同样用于处理函数重载以及派生类和基类成员函数重名的情况。
个人理解,有误之处请指教!
xwfde 2011-02-13
  • 打赏
  • 举报
回复
函数名就是它的地址。函数代码不存在入栈问题,入栈的是数据。代码始终在代码段,由程序运行指针一条条往下指,代码是顺序存储的,也是顺序执行的,所以程序运行指针每次会自动加一,除非碰到跳转指令,则跳转到指定地址继续顺序执行。所有函数都有一个入口地址,就是其代码的开始处,在语言中就是函数名,执行时将参数,数据入栈,出栈,程序代码本身不存在什么入不入栈的。
匚匚 2011-02-13
  • 打赏
  • 举报
回复
呵呵,我没学过汇编
bluesky12312388 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhw952 的回复:]

有所悟,但还真没想过:main()外面的函数,为什么可以在main()中调用
[/Quote]
为什么不可以,回想一下在学X86汇编的时候学proc调用那段就很清楚了。
匚匚 2011-02-13
  • 打赏
  • 举报
回复
有所悟,但还真没想过:main()外面的函数,为什么可以在main()中调用
雪人2015 2011-02-13
  • 打赏
  • 举报
回复
类函数中的数据也是通过这种方法,通过类指针找到对应对象的数据成员。
雪人2015 2011-02-13
  • 打赏
  • 举报
回复
C++如何实现的面向对象技术呢?

其实还是C语言的那套东西,原来的C++的编译器都是把C++翻译成C语言代码,然后用C语言编译器生成目标文件。所以就此看来C++的面向对象技术完全可以用C函数实现出来。那么这就是楼主想知道的东西了。

其实类中的非静态函数就跟普通函数一样对待。只是编译器在编译的时候会自动在参数列表最后加上类指针。所以
class A
{
int a;
public:
A(int a):a(a){}
void Show()(cout<<a;}
}

实际编译器编译成一个函数
void Show(A* this);//与类基本无关了。

然后在main中调用的时候
A b;
b.Show();
编译器编译的时候看成是这样的代码:
A b;
Show(&b);

所以楼主你说编译器怎么知道Show的地址的。就跟你问为什么main()外面的函数,为什么可以在main()中调用时一样的。
bluesky12312388 2011-02-13
  • 打赏
  • 举报
回复
《Inside C++ Object Model》里的第四章里指出,(中译版P141)

C++的设计准则之一就是:nonstatic member function 至少必须和一般nonmember function 有相同的效率,
也就是说下面两种函数应该等效,
 float magnitude3d(const Point3d * _this) {}
float Point3d::magnitude3d() const {},

下面又提到 编译器内部已经将"member 函数实体"转换对为对等的"nonmember函数实体"
DontKissBossAss 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhw952 的回复:]
void Fun(A *this);

这个this指向了某个类对象如 A b; this=&b;

为b分配存储空间时,只包括b的非静态数据成员,而b的成员函数却存储在代码段。在调用b的成员函数如b.Fun()时,它是如何知道成员函数存储在代码段中的地址的?this只是让系统调用b这个对象的私有数据成员,它应该不存储成员函数在代码段中的地址吧?

再比如,在主……
[/Quote]

b.func 在编译时期就能知道func在PE文件中的地址,当执行b.func调用时只是CALL B::func(ADDR)的事情, this 只是语法层面的成员选择辅助工具吧,他不会存储,要存储的也只是对象,当编译器需要时,把成员函数按照1楼所示,转换后,对象的地址,会被“当作”this吧。
feng4206yu 2011-02-13
  • 打赏
  • 举报
回复
回6L,那应该是编译器的事情吧.
匚匚 2011-02-13
  • 打赏
  • 举报
回复
void Fun(A *this);

这个this指向了某个类对象如 A b; this=&b;

为b分配存储空间时,只包括b的非静态数据成员,而b的成员函数却存储在代码段。在调用b的成员函数如b.Fun()时,它是如何知道成员函数存储在代码段中的地址的?this只是让系统调用b这个对象的私有数据成员,它应该不存储成员函数在代码段中的地址吧?

再比如,在主函数中调用子函数,首先入栈的应是子函数下一语句的地址吧,在子函数调用完毕,再通过这个地址执行下面的语句吧?

[Quote=引用 1 楼 bluesky12312388 的回复:]
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
===============================================================
跟普通函数一样在代码段

类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
=====================================================……
[/Quote]
feng4206yu 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhw952 的回复:]
this是指向类对象的指针,不是指向类函数的指针
this是全局性的?
[/Quote]
他的意思是说函数都放在一个代码段里...只是成员函数有额外的参数而已
feng4206yu 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky12312388 的回复:]
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
===============================================================
跟普通函数一样在代码段

类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
=====================================================……
[/Quote]
学习.
匚匚 2011-02-13
  • 打赏
  • 举报
回复
this是指向类对象的指针,不是指向类函数的指针
this是全局性的?
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
可以看看Inside C++ object module
bluesky12312388 2011-02-13
  • 打赏
  • 举报
回复
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
===============================================================
跟普通函数一样在代码段

类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
================================================================
你类对象调用的时候其实跟调用普通函数一样,只不过有一个隐式的this指针参数
也就是说
class A
{
public:
void Fun();
};
被编译成void Fun(A *this);这种形式了,

64,670

社区成员

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

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