读书人

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

发布时间: 2012-04-11 17:42:33 作者: rapoo

非静态的成员函数存储在什么地方?
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?

类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?

[解决办法]
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
===============================================================
跟普通函数一样在代码段

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

探讨
this是指向类对象的指针,不是指向类函数的指针
this是全局性的?

[解决办法]
回6L,那应该是编译器的事情吧.
[解决办法]
探讨
void Fun(A *this);

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

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

再比如,在主……

[解决办法]
《Inside C++ Object Model》里的第四章里指出,(中译版P141)

C++的设计准则之一就是:nonstatic member function 至少必须和一般nonmember function 有相同的效率,
也就是说下面两种函数应该等效,
C/C++ code
 float magnitude3d(const Point3d * _this) {}  float Point3d::magnitude3d() const {},
[解决办法]
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()中调用时一样的。
[解决办法]
类函数中的数据也是通过这种方法,通过类指针找到对应对象的数据成员。
[解决办法]
探讨

有所悟,但还真没想过:main()外面的函数,为什么可以在main()中调用

[解决办法]
函数名就是它的地址。函数代码不存在入栈问题,入栈的是数据。代码始终在代码段,由程序运行指针一条条往下指,代码是顺序存储的,也是顺序执行的,所以程序运行指针每次会自动加一,除非碰到跳转指令,则跳转到指定地址继续顺序执行。所有函数都有一个入口地址,就是其代码的开始处,在语言中就是函数名,执行时将参数,数据入栈,出栈,程序代码本身不存在什么入不入栈的。

读书人网 >C++

热点推荐