C_and_CPP 板


LINE

之前有問過這問題 // 任意的非0值,因為0乘任何數都得0 #define SOME_VALUE 1 cout << (DWORD)static_cast<Base1*>((Drive*)SOME_VALUE)-SOME_VALUE << endl; cout << (DWORD)static_cast<Base2*>((Drive*)SOME_VALUE)-SOME_VALUE << endl; cout << (DWORD)static_cast<Base3*>((Drive*)SOME_VALUE)-SOME_VALUE << endl; 這會印 0 4 8 這之前文章我已知道為什麼了 不過我揣摩一下他註解 // 任意的非0值,因為0乘任何數都得0 這不知道再解釋什麼 如果把SOME_VALUE define 0 印出來全部都是0 發現 cout << (DWORD)static_cast<Base2*>((Drive*)SOME_VALUE); 就已經是0了 我粗淺的以為他轉型只會管要 "加" 多少offset 不過為啥他沒有+4.... 這跟他註解提到 "乘" 有關係嗎!? 謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.207.215
1F:→ holyspectral:為何不去問作者? 03/11 18:52
2F:推 layan:keyword: offsetofclass 用來計算base類別在child類別的 03/11 19:36
3F:→ layan:class layout 中的 offset value. 03/11 19:36
4F:→ layan:這個 Macro 在 ATL 中找的到. 而該 value 通常被定義成 8 03/11 19:38
5F:→ layan:它的值決不能為0,要是0的話怎麼乘都是0那就算不出 offset 了 03/11 19:39
6F:→ layan:也因為它只是用來算offset, 所以SOME_VALUE值只要非 0 即可 03/11 19:40
7F:→ layan:不一定要真的給一個真正在memory裡合法的 address. 03/11 19:41
8F:→ layan:這個技巧應該是用在 COM Programming 裡比較常見. 03/11 19:42
9F:→ layan:You can check CodeProject: ATL Under the Hood - Part 1 03/11 19:42
10F:→ layan:我想原本寫這code的人應該在練習virtual table的概念. 03/11 19:44
11F:→ layan:建議你直接去看CodeProject那篇文章code和你貼的一模一樣 03/11 19:45
12F:→ QQ29:我問題就是@@為什麼會提到 乘...哪個地方會做乘法呢?? 03/11 22:35
13F:推 layan:哦, SOME_VALUE 會被拿來乘以指標 (4 bytes) 03/11 22:48
14F:→ layan:因為virtual table每個 entry 都是各個 base 的指標 03/11 22:49
15F:→ layan:這也是為啥你印出來都是 4 的倍數 XDXD 03/11 22:49
16F:→ QQ29:不太懂~ 為什麼會拿來*4 如果有*4那不是應該帶SOME_VALUE=2 03/12 00:31
17F:→ QQ29:就得不一樣的結果嗎@@ 不太懂乘 是只哪邊~ 03/12 00:32
18F:推 layan:SOME_VALUE的值不是拿來乘的 只是被拿來代表一個偽有效位址 03/12 00:43
19F:→ layan:透過運算後可知BaseX*是在Derive class的 virtual table 的 03/12 00:44
20F:→ layan:第 K 個 entry, 這個第K個entry再乘上 4, 就是印出來的結果 03/12 00:45
21F:→ layan:再不懂的話 建議你去看一些 C++ virtual table 的部份 03/12 00:46
22F:→ layan:或是那篇文章畫的一些 virtual table layout 圖. 03/12 00:46
23F:→ QQ29:嗯我有看那個圖 但是我不懂 第K個entry 跟 SOME_VALUE 的關係 03/12 01:04
24F:→ QQ29:跟您說 透過運算 得到entry 這之間 0跟非0 他運算到底是如何 03/12 01:05
25F:→ QQ29:得知的呢? 03/12 01:06
26F:推 layan:要是 SOME_VALUE 是0 , offset 永遠是 0, 代表 K 永遠是 0 03/12 10:27
27F:推 LPH66:我有個不同看法...值為 0 的指標根據定義叫做 NULL pointer 03/12 11:00
28F:→ LPH66:(標準是說整數 0 轉成指標時就是 NULL pointer) 03/12 11:00
29F:→ LPH66:那麼即使它是這樣的繼承結構 但一個 NULL pointer 轉過去時 03/12 11:01
30F:→ LPH66:還是得要是個 NULL pointer 才是... 03/12 11:01
31F:→ LPH66:所以和 offset 什麼的比較沒什麼關係 03/12 11:02
32F:→ LPH66:比較像是 layan 版友講的「只是被拿來代表一個偽有效位址」 03/12 11:02







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping 或 站內搜尋

TOP