最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析c++中參數(shù)對象與局部對象的析構順序的詳解

 更新時間:2013年05月13日 09:03:54   作者:  
本篇文章是對c++中參數(shù)對象與局部對象的析構順序進行了詳細的分析介紹,需要的朋友參考下

下面是c++的源碼:

復制代碼 代碼如下:

class X  {
public:
   int i;
   int j;
   ~X() {}

};
void f(X x) {
  X x1;
  x.i = 1;
  x.j = 2;

}
int main() {
    f(X());
}


下面是main函數(shù)的匯編碼:
復制代碼 代碼如下:

_main    PROC

; 15   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 8;為臨時對象預留8byte空間,由于沒有顯示定義構造函數(shù),
              ;而且這種情況下編譯器提供無用的默認構造函數(shù),因此看不到構造函數(shù)的調用

; 16   :     f(X());

    mov    eax, DWORD PTR $T2560[ebp+4];將偏移臨時變量的首地址4byte處內存中內容給eax,即將臨時變量的成員變量j值給eax
    push    eax;將eax壓棧
    mov    ecx, DWORD PTR $T2560[ebp];將臨時變量首地址中的內容給ecx,即將臨時變量中的成員變量i值給ecx
    push    ecx;將ecx壓棧
               ;上面四句創(chuàng)建了臨時變量的一份拷貝,作為參數(shù)調用f
    call    ?f@@YAXVX@@@Z                ; 調用函數(shù)f
    add    esp, 8;將棧頂指針下移8byte,釋放為參數(shù)對象的提供的??臻g
    lea    ecx, DWORD PTR $T2560[ebp];將臨時對象的首地址給ecx
    call    ??1X@@QAE@XZ                ; 為臨時對象調用析構函數(shù)

; 17   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP



從上面可以看出,產(chǎn)生的臨時對象在函數(shù)調用完成退出后才調用析構函數(shù)。

下面是f函數(shù)的匯編碼:

復制代碼 代碼如下:

?f@@YAXVX@@@Z PROC                    ; f

; 9    : void f(X x) {

    push    ebp
    mov    ebp, esp
    sub    esp, 8;為局部對象x1預留8byte的空間

; 10   :   X x1;
; 11   :   x.i = 1;

    mov    DWORD PTR _x$[ebp], 1;把1寫給參數(shù)對象首地址處,即把1寫入?yún)?shù)對象的成員變量i

; 12   :   x.j = 2;

    mov    DWORD PTR _x$[ebp+4], 2;把2寫入偏移參數(shù)對象首地址4byte處的內存,即把2寫入?yún)?shù)對象的成員變量j

; 13   :    
; 14   : }

    lea    ecx, DWORD PTR _x1$[ebp];將局部變量x1的首地址給ecx
    call    ??1X@@QAE@XZ                ; 為x1調用析構函數(shù)
    lea    ecx, DWORD PTR _x$[ebp];將參數(shù)對象的首地址給ecx
    call    ??1X@@QAE@XZ                ; 為參數(shù)對象調用析構函數(shù)
    mov    esp, ebp
    pop    ebp
    ret    0
?f@@YAXVX@@@Z ENDP                    ; f
; Function compile flags: /Odtp
_TEXT    ENDS
;    COMDAT ??1X@@QAE@XZ
_TEXT    SEGMENT
_this$ = -4                        ; size = 4
??1X@@QAE@XZ PROC                    ; X::~X, COMDAT
; _this$ = ecx

; 6    :    ~X() {}

    push    ebp
    mov    ebp, esp
    push    ecx
    mov    DWORD PTR _this$[ebp], ecx
    mov    esp, ebp
    pop    ebp
    ret    0
??1X@@QAE@XZ ENDP


從上面的代碼可以看出,參數(shù)對象和局部對象都是在函數(shù)退出之前調用析構函數(shù)。并且參數(shù)對象在局部對象調用析構函數(shù)之后再調用自己的析構函數(shù)。

相關文章

  • C語言實現(xiàn)單鏈表的快速排序算法

    C語言實現(xiàn)單鏈表的快速排序算法

    大家好,本篇文章主要講的是C語言實現(xiàn)單鏈表的快速排序算法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++的頭文件和實現(xiàn)文件詳解

    C++的頭文件和實現(xiàn)文件詳解

    這篇文章主要介紹了C++的頭文件和實現(xiàn)文件詳解的相關資料,需要的朋友可以參考下
    2015-01-01
  • LoadLibrary深入案例詳解

    LoadLibrary深入案例詳解

    這篇文章主要介紹了LoadLibrary深入案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C++指向類成員的指針詳解

    C++指向類成員的指針詳解

    指向類成員的指針總的來講可以分為兩大類四小類(指向數(shù)據(jù)成員還是成員函數(shù),指向普通成員還是靜態(tài)成員),希望本片文章能給你帶來幫助
    2021-09-09
  • C語言實現(xiàn)掃雷小游戲的示例代碼

    C語言實現(xiàn)掃雷小游戲的示例代碼

    這篇文中主要為大家詳細介紹了如何利用C語言實現(xiàn)經(jīng)典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • C++之std::vector刪除元素的幾種方式及區(qū)別說明

    C++之std::vector刪除元素的幾種方式及區(qū)別說明

    這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 純C語言:分治快速排序源碼分享

    純C語言:分治快速排序源碼分享

    這篇文章主要介紹了分治快速排序源碼,有需要的朋友可以參考一下
    2014-01-01
  • VC中實現(xiàn)GB2312、BIG5、Unicode編碼轉換的方法

    VC中實現(xiàn)GB2312、BIG5、Unicode編碼轉換的方法

    這篇文章主要介紹了VC中實現(xiàn)GB2312、BIG5、Unicode編碼轉換的方法,該功能非常實用,需要的朋友可以參考下
    2014-07-07
  • C++實現(xiàn)LeetCode(118.楊輝三角)

    C++實現(xiàn)LeetCode(118.楊輝三角)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • c異或運算 c異或運算符號

    c異或運算 c異或運算符號

    位運算的運算分量只能是整型或字符型數(shù)據(jù),位運算把運算對象看作是由二進位組成的位串信息,按位完成指定的運算,得到位串信息的結果
    2014-06-06

最新評論

清原| 万年县| 甘德县| 宁安市| 阳新县| 太湖县| 虞城县| 康保县| 都兰县| 崇信县| 河池市| 天祝| 德化县| 阿合奇县| 名山县| 多伦县| 济南市| 邳州市| 商水县| 泽库县| 赤峰市| 黄山市| 桐乡市| 晴隆县| 裕民县| 松阳县| 栾川县| 芜湖市| 大竹县| 舞阳县| 宜兰市| 辰溪县| 大荔县| 茌平县| 镇宁| 岢岚县| 南溪县| 开平市| 宁波市| 宝山区| 昌黎县|