歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++程序運行時內存布局之----------this到底是什麼?

C++程序運行時內存布局之----------this到底是什麼?

日期:2017/3/1 9:44:37   编辑:Linux編程

先問一個問題,在C++裡,成員函數裡的this指針和調用此函數的對象地址總是一樣的嗎?如果你的回答是:不一定。那麼至少你是個老手吧,下面的內容你就不用看了;如果你的回答是:是啊,那麼強烈建議你看看下面的內容。

非靜態成員函數,無論是不是虛函數,都隱藏了一個this指針參數。這個參數的目的就是給函數提供一個基地址,以便於函數體內能找到對象的成員變量。那非靜態成員函數是如何根據this指針找到成員變量的呢?

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm

C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm

直接看例子吧

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指針的地址相同,內存圖如下所示。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101577p2.htm

Copyright © Linux教程網 All Rights Reserved