用彙編的眼光看C (之算術符過載陷阱)

2021-08-17 15:35:50 字數 2028 閱讀 1051

在算術符過載裡面,「=」過載可能是最經常使用的一種。但是好多人就誤以為在函式中,凡是類出現「=」的地方,那就是呼叫算術符過載,其實不然。為什麼呢?我們可以看看下面的**。首先,我們定義乙個基本類:

[cpp]view plain

copy

class

data  

}  data(const

data& d)  

~data()  

data& operator=(const

data& d)  

intget_number() 

const

char

* get_point() 

const

};  

定義好了函式之後,我們就開始對這個類進行呼叫,同樣**如下所示:

[cpp]view plain

copy

45:       data m(10);  

0040108d   push        0ah  

0040108f   lea         ecx,[ebp-14h]  

00401092   call        @ilt+30(data::data) (00401023)  

00401097   mov         dword ptr [ebp-4],0  

46:       data p = m;  

0040109e   lea         eax,[ebp-14h]  

004010a1   push        eax  

004010a2   lea         ecx,[ebp-1ch]  

004010a5   call        @ilt+35(data::data) (00401028)  

004010aa   mov         byte ptr [ebp-4],1  

47:       p = m;  

004010ae   lea         ecx,[ebp-14h]  

004010b1   push        ecx  

004010b2   lea         ecx,[ebp-1ch]  

004010b5   call        @ilt+5(data::operator=) (0040100a)  

48:   }  

上面共有三句話,我們逐一進行分析:

45句:定義了乙個臨時變數,呼叫data的建構函式

46句:出現了乙個臨時變數p,這裡發現data類並沒有呼叫算術符過載函式,而是呼叫了data的建構函式,根據45句所示,呼叫的肯定不是普通的建構函式,那麼剩下的結果只能是拷貝建構函式

47句: 和46句的**是一致的,但是此時呼叫的函式才是算術符過載函式

所以說,出現「=」的地方未必呼叫的都是算術符過載函式,也有可能是拷貝建構函式。那麼什麼時候是拷貝建構函式,什麼時候是算術符過載函式呢?判斷的標準其實很簡單。如果臨時變數是第一次出現,那麼呼叫的只能是拷貝建構函式,反之如果變數已經存在,就像47句一樣,那麼呼叫的只能是算術符過載函式,但是我們這裡定義的算數符過載函式有乙個陷阱,不知道大家看出來沒有?

我提示大家一下,這裡的算術符過載需不需要判斷拷貝的是不是自己呢?

[cpp]view plain

copy

void

process()  

這裡最後一句,如果算術符可以自己拷貝給自己,**正常編譯和執行都沒有問題,但是在某些情況下會出現很多意想不到的情況。大家可以跟著我的思路來:

[cpp]view plain

copy

data& operator=(

const

data& d)  

如果上面的**沒有判斷複製的物件是不是自己,那麼我們發現實際上value的資料實際上已經free掉了。那麼此時重新分配記憶體,拷貝的資料只有天知道是什麼資料。原來value指向的記憶體空間就存在了很大的不確定性,這就是算術符過載的陷阱。

用彙編的眼光看C (之算術符過載陷阱)

在算術符過載裡面,過載可能是最經常使用的一種。但是好多人就誤以為在函式中,凡是類出現 的地方,那就是呼叫算術符過載,其實不然。為什麼呢?我們可以看看下面的 首先,我們定義乙個基本類 class data data const data d data data operator const data ...

用彙編的眼光看C (之算術符過載陷阱)23

在算術符過載裡面,過載可能是最經常使用的一種。但是好多人就誤以為在函式中,凡是類出現 的地方,那就是呼叫算術符過載,其實不然。為什麼呢?我們可以看看下面的 首先,我們定義乙個基本類 cpp view plain copy class data data const data d data data ...

用彙編的眼光看C (之嵌入彙編)

嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...