C++程序运行时内存布局之----------this到底是什么?


先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。

非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参数的目的就是给函数提供一个基地址,以便于函数体内能找到对象的成员变量。那非静态成员函数是如何根据this指针找到成员变量的呢?

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

C++11 获取系统时间库函数 time since epoch

C++11中正则表达式测试

直接看例子吧

1没有虚表的情况

#include <iostream>
#include <stdio.h>

using namespace std;

class A
{
public:
 int x;
 int y;
public:
 void F1()
 {
  this->x = 1;
  this->y = 2;
  cout<<"this指针得值是:"<<std::hex<<std::showbase<<this<<endl;
 }
};

 

int main(int argc, char** argv)
{
 A a;
 cout<<"a对象的地址是:"<<&a<<endl;
 cout<<"a对象的大小是:"<<sizeof(A)<<endl;
 cout<<"成员a.x的地址是: "<<&a.x<<endl;
 cout<<"成员a.x的偏移是:"<<&A::x<<endl;
 a.F1();
 cin>>argc;
 return 0;
}

那么函数F1的实现伪代码为:

 

*(this+&A::x-1) = 1;

*(this+&A::y-1) = 2;

 

其中&A::x是成员x的偏移+1,&A::y是成员y的偏移+1,这可是C++基本语法的知识,希望你知道,呵呵。可这些偏移量是相对应那里的偏移呢,是对象地址吗,答案是NO。是相对于第一个成员变量的偏移,这对于有些对象也许没有差别,但是对于有虚表的类的对象,就有差别了。这些偏移在编译期间就是确定了的。对于本例在VC++2010下&A::x,值为1, &A::y,值为5。为什么不是0,4,请看《Inside The C++ Object Model》。

所以,对于找到成员变量,需要进一步确定的只有this的值。程序运行结果如下:

可见此例中,对象的地址与this指针的地址相同,内存图如下所示。

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 3
  • 下一页

相关内容