首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-05 
c++对象模型最近在翻insidec++objectmodel看第一章时有一点疑惑:classA{public:voidfun()virtualvoidprin

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

热点排行