c++对象模型
最近在翻 inside c++ object model
看第一章时有一点疑惑:
class A
{
public:
void fun();
virtual void print();
static int s_fun();
private:
int m_x;
static int m_s;
}
类A的内存空间只放了一个virtl ptr和一个int成员变量;
其中virtl ptr 指向属于A类的唯一vtable;
static 成员放在静态数据区里;
那成员函数时怎么回事呢? 他们应该有属于他们自身的地址空间吧?
static member func 是不是放在静态地址区域?
其他非 static member func 呢?
那这些函数是不是属于类而不是对象的?即 如果A类有多个对象,而内存只有一份
fun(),就像static 成员数据一样?
[解决办法]
明白一点说,成员函数被变成了这样:
A::fun()在编译后成了_A__fun(A* this),而a.fun()的调用就成了_A__fun(&a)
所以你能看出来,非virtual的成员函数是不需要任何额外的内存空间的。
而A::s_fun()作为静态成员函数就会成了_A__s_fun(),A::s_fun()就是直接调用_A__s_fun()
PS:以上名称转换由编译器自行决定规则,这里只是一个例子
[解决办法]
那成员函数时怎么回事呢? 他们应该有属于他们自身的地址空间吧?
static member func 是不是放在静态地址区域?
其他非 static member func 呢?
那这些函数是不是属于类而不是对象的?即 如果A类有多个对象,而内存只有一份
fun(),就像static 成员数据一样?
===============================
非 static member func 和普通的c函数没区别,整个类只有一份(位于代码段)
是靠this指针来和识别是谁调用了它(exp:对于实例数据成员的访问 通过这个this就可以找到this-> m_x 实质上就是实例首+m_x的偏移)
static 成员数据也整个类有一份(好像看过有人说静态数据成员,如果定义了而类实例没有对他引用,编译器会优化调它。没具体实验过不清楚)