读书人

c++对象模型,该怎么解决

发布时间: 2012-02-05 12:07:14 作者: rapoo

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 成员数据也整个类有一份(好像看过有人说静态数据成员,如果定义了而类实例没有对他引用,编译器会优化调它。没具体实验过不清楚)

读书人网 >C++

热点推荐