非静态的成员函数存储在什么地方?
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
[解决办法]
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
===============================================================
跟普通函数一样在代码段
类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里?
================================================================
你类对象调用的时候其实跟调用普通函数一样,只不过有一个隐式的this指针参数
也就是说
class A
{
public:
void Fun();
};
被编译成void Fun(A *this);这种形式了,
[解决办法]
可以看看Inside C++ object module
[解决办法]
[解决办法]
回6L,那应该是编译器的事情吧.
[解决办法]
[解决办法]
《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()中调用时一样的。
[解决办法]
类函数中的数据也是通过这种方法,通过类指针找到对应对象的数据成员。
[解决办法]
[解决办法]
函数名就是它的地址。函数代码不存在入栈问题,入栈的是数据。代码始终在代码段,由程序运行指针一条条往下指,代码是顺序存储的,也是顺序执行的,所以程序运行指针每次会自动加一,除非碰到跳转指令,则跳转到指定地址继续顺序执行。所有函数都有一个入口地址,就是其代码的开始处,在语言中就是函数名,执行时将参数,数据入栈,出栈,程序代码本身不存在什么入不入栈的。