看板 C_and_CPP 關於我們 聯絡資訊
會提出這兩個程式碼是因為我想知道什麼情況 member function pointer 的這兩部份會改變, 再猜了很多情形後, 這兩個程式碼可以感受到這個變化。 簡單提一下就好: void (A::*p)() = &A::abc; 80486b6: c7 44 24 18 05 00 00 movl $0x5,0x18(%esp) 80486bd: 00 80486be: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp) 80486c5: 00 抱歉, 我貼錯了 這才是我指的第二部份 void (AB::*p)() = &B::ff; 8048736: c7 44 24 28 01 00 00 movl $0x1,0x28(%esp) 804873d: 00 804873e: c7 44 24 2c 08 00 00 movl $0x8,0x2c(%esp) 8048745: 00 --------------------------- 原文 (非我本意) --------------------------------- void (A::*p)() = &A::abc; 8048646: c7 44 24 18 e2 86 04 movl $0x80486e2,0x18(%esp) 804864d: 08 804864e: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp) 8048655: 00 --------------------------------------------------------------------- 所以在不同情況下, member function pointer 這兩個部份改變也有所不同, 只是我覺得沒完沒了, 所以到此先打住。我可不想玩排列組合。 加上之前的例子, 這樣應該足夠看出 member function pointer 和一般 function pointer 的不同之處。 C 應該沒有類似的東西, C 指標應該很單純就指向某個記憶體位址。 ※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言: : 這會影響 member function pointer 第一部份。 : 1 #include <iostream> : 2 #include <cstdio> : 3 : 4 using namespace std; : 5 : 6 struct A : 7 { : 8 virtual void func() : 9 { : 10 printf("i: %d\n", i_); : 11 } : 12 virtual void abc() : 13 { : 14 printf("abc i: %d\n", i_); : 15 } : 16 A() : 17 { : 18 i_=10; : 19 } : 20 private: : 21 int i_; : 22 }; : 23 : 24 : 25 int main() : 26 { : 27 void (A::*p)() = &A::abc; : 28 A a; : 29 (a.*p)(); : 30 : 31 return 0; : 32 } : member function pointer 的第二部份 : 1 #include <iostream> : 2 #include <cstdio> : 3 : 4 using namespace std; : 5 : 6 struct A : 7 { : 8 virtual void func() : 9 { : 10 printf("i: %d\n", i_); : 11 } : 12 A() : 13 { : 14 i_=10; : 15 } : 16 private: : 17 int i_; : 18 }; : 19 : 20 struct B : 21 { : 22 virtual void ff() : 23 { : 24 printf("i: %d\n", i_); : 25 } : 26 B() : 27 { : 28 i_=10; : 29 } : 30 private: : 31 int i_; : 32 }; : 33 : 34 struct AB : public A, public B : 35 { : 36 virtual void func() : 37 { : 38 printf("i am ab\n"); : 39 } : 40 virtual void ff() : 41 { : 42 printf("i am ab ff\n"); : 43 } : 44 }; : 45 : 46 int main() : 47 { : 48 void (AB::*p)() = &B::ff; : 49 AB ab; : 50 (ab.*p)(); : 51 : 52 return 0; : 53 } : 有點沒完沒了的感覺, 就此先打住, 讓有興趣的人研究。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.139.183
Ebergies:看第一篇還想說怎麼最後一篇會是這個, 原來... LOL 09/07 18:21
GNUGCC:看完 descent 大大公布輸出結果不知有何感想? 09/07 23:09
LPH66:咦, 我們問的一直都是 G 兄您的感想... 09/07 23:14
LPH66:問 G 兄您在看到這個跟您之前的主張相矛盾的結果的感想... 09/07 23:15
GNUGCC:此話怎說?為何會覺得我主張相矛盾? 09/07 23:46
LPH66:您主張「指標內容是一個標示記憶體某處位址的整數」對吧? 09/08 00:11
LPH66:那 descent 的結果(或我在前篇推文貼的程式)正反駁了這主張 09/08 00:11
GNUGCC:我在前面已說過,各位只是看到包裝後的結果,但實際上編譯器 09/08 00:32
GNUGCC:還是把記憶體位址儲存在指標內,如果您反駁這項理論,那就請 09/08 00:33
GNUGCC:您說說反對的理由是? 09/08 00:33
Feis:各位只是看到包裝後的結果,但實際上編譯器還是把整數儲存在 09/08 00:46
Feis:浮點數內, 如果您反駁這項理論,那就請您說說反對的理由是? 09/08 00:46
Feis:喔. 我錯了. 不是編譯器! 09/08 00:49
GNUGCC:我覺得做為一個學術論者,應該有本身的修養才是,而不是把精 09/08 00:49
GNUGCC:神用在無用的嘴炮上. 09/08 00:50
Feis:您可以先說說您的理由嗎? 學術論者應該不是說我? 09/08 00:51
GNUGCC:否則只是在「原地踏步而不知為何其所然」. 09/08 00:51
Feis:IEEE 754 我想 G 大應該很熟阿? 09/08 00:51
GNUGCC:若有問題請以「不恥下問」的態度來學習. 09/08 00:52
Feis:那請問怎樣才叫不恥下問? 我覺得我蠻有禮貌的? 09/08 00:53
Feis:我很想學習怎麼樣不透過整數去定義浮點數. 您可教教我嗎? 09/08 00:53
GNUGCC:Feis 大大,您覺得這麼多的問題我應該先回答那一個? 09/08 00:55
Feis:都可以. 您方便就好! 感謝 :) 09/08 00:56
GNUGCC:我覺得很奇怪的是,我只是單純的在說明一件事情,但為何會有 09/08 00:57
GNUGCC:人喜歡用放大鏡做過度的解讀以致於今天這種場面. 09/08 00:58
Feis:應該是因為你的說明很有趣阿. 跟我們認知的有些差異 09/08 00:59
Feis:G 大的意思如果只是說指標裡面通常會包含記憶體位址 09/08 01:00
Feis:應該跟我認知就比較像? 09/08 01:01
GNUGCC:呵呵~或許是吧. 09/08 01:01
Feis:只是 G 大喜歡使用 "一定" 這個字眼, 大家當然後有放大效果 09/08 01:03
GNUGCC:您剛問「不透過整數去定義浮點數」,這個論點是您個人? 09/08 01:04
Feis:我是想表達浮點數格式通常也是包含整數 09/08 01:05
Feis:但是我們不會說浮點數就是整數這種話~ 09/08 01:06
GNUGCC:那您的問題跟想表達的事情是兩回事吧 09/08 01:07
Feis:怎麼說? 那 G 大覺得指標跟整數的關係是? 09/08 01:08
GNUGCC:「浮點數就是整數」這句話有誰說過? 09/08 01:08
GNUGCC:第一個,您的問題答案是沒人有這種論點而且我也不知道為何您 09/08 01:10
GNUGCC:會有這個問題,第二,浮點數格式跟整數格式是不相同的. 09/08 01:11
GNUGCC:F 大,您即然否定「一定」這個定義,那您可說說指標在正常的 09/08 01:13
GNUGCC:使用下除了記憶體位址以外還能夠存什麼呢? 09/08 01:14
Feis:第二: 我們常用的浮點數格式是用整數格式定義來的. 09/08 02:20
Feis:G 大. 這篇的主題就是在講這個~ 晚安! 09/08 02:21
※ 編輯: descent 來自: 59.125.239.46 (09/11 08:23)