青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

EverSpring working shop

To pursue creative ideas based on nature.

統計

留言簿(1)

他山之石

閱讀排行榜

評論排行榜

面試中碰到的一個C++陷阱

面試官先問了幾個老掉牙的問題,虛函數是用來干嘛的,動態(tài)邦定是怎么回事,虛函數表怎么回事,心中暗喜。逐一化解。然后此人漫不經心的來了一句,虛函數指針有多大。因為差不多是面試的尾聲了,前面大家相談甚歡,頗有相見恨晚之勢。誰知道一切都是幻覺。俺想也沒有想,虛函數指針么,不就是32位那么大么。面試官笑而不答,俺也自以為是。
。。。。。
若干天后一個人發(fā)呆,突然想起這個問題,貌似某天灑家曾經在寫code的時候碰到過非靜態(tài)成員函數指針類型不能賦給普通函數指針,因為成員函數指針必須包含this指針來限定。一拍大腿,那這樣的話,那天俺信誓旦旦的告訴面試官 虛函數指針不就是普通函數指針么,就是大錯特錯啦。雖然不明白細節(jié),但是如果不那么心急回答,即使不明白大小的確切值,也應該稍作停頓,告訴他可能有所不同?;谥硪?。雖然進入后續(xù)環(huán)節(jié),但是這個瑕疵對自己是大大的不利阿,而這個不利本身是可以避免的。

posted on 2009-03-17 22:01 everspring79 閱讀(3281) 評論(21)  編輯 收藏 引用 所屬分類: Notes

評論

# re: 面試中碰到的一個C++陷阱 2009-03-17 23:18 xxxx

那我告訴你,你現在的想法依然是錯的

“成員函數指針必須包含this指針”,試問指針如何包含指針

方便的話說一下你是在面試哪家牛企?  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 09:18 夢在天涯

哦,只要是指針在32位就是4個字節(jié),就是32位,沒有錯!  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 09:21 夢在天涯

大家說是不是,至于對static和非staic的編譯后時候要多傳this,那是參數的問題,不是指針的問題!

你可以參考我的C++對象模型系列,那從虛函數表中獲得虛函數指針那就是int*++,那就是32位!

  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 10:01 everspring79

@xxxx
哈哈,其實成員函數指針不是普通意義上的指針,是個結構,可能包含指針或者偏移信息,而且應不同的編譯器而不同,你還是研究下再來說我的想法是錯的。當然我文中的表述并不精確。
我想面試官當時的目的是想我能表達出虛函數指針與普通函數指針的不同,虛函數指針并非傳統意義上的指針。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 10:04 wocow3

X86平臺上,成員函數跟普通_cdecl函數的區(qū)別在于成員函數將this指針放到ecx寄存器中傳遞,其他函數參數還是跟_cdecl一樣壓棧
32位平臺上一切指針都是32位的,你這么回答也不錯。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 10:04 everspring79

@夢在天涯
你獲得的那個是地址,而非完全意義上的虛函數指針。我當時也是這么想的,VPTR加上位移獲得虛函數地址。但是面試官既然問虛函數指針有多大,完美的回答應該告訴他虛函數指針本身不同于普通指針,除了地址信息還有別的內容。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 10:55 Alex-Lee

6.函數與虛函數
編譯器為每個有虛函數的類都建立一個虛函數表(其大小不計算在類中),并為這個類安插一個指向虛函數表的指針,即每個有虛函數的類其大小至少為一個指針的大小4
class A{
public:
int a;
void Function();
};
class B{
public:
int a;
virtual void Function();
};
class C:public B{
public:
char b;
};
class D:public B{
public:
virtual void Function2();
};
class E{
public:
static void Function();
};
sizeof (A) = 4 (內含一個int,普通函數不占大小)
sizeof (B) = 8 (一個int ,一個虛函數表指針)
sizeof (C) =12 (一個int ,一個虛函數表指針,一個char ,再加上數據對齊)
sizeof (D) = 8 (一個int ,一個虛函數表指針,多個虛函數是放在一個表里的,所以虛函數表指針只要一個就行了)
sizeof (E) = 1 (static 函數不占大小,空類大小為1)


參考:http://hi.baidu.com/weiloujushi/blog/item/33f7f8b75d7a35f330add131.html

等會驗證下  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 13:28 Kevin Lynx

大家應該明確下這里討論的東西,【虛函數指針】,終究來說還是指針,32位機器上就是32位。我覺得博主在這里和大家討論并沒有針對指針這個概念。成員函數指針也是個指針,也是32位,但是其指針值不同一般指針。

面試官問你的問題如果類似于:xxxx指針有多大。。那很明顯,要么是他表述問題的能力有問題,要么是其真的不懂這些東西。面試你的人不見得就比你牛。
  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 14:00 wocow3

成員函數指針到底是個什么東西?
貌似不同的編譯器有不同的實現。網上介紹gcc的實現是個結構體(手頭沒gcc沒驗證)。
對vc而言,它就是一個指針,一個32位的地址。
但是它的值根據聲明的 成員函數指針 是否指向 虛函數 而不同。
如果成員函數指針聲明是一個普通成員函數的指針,那它的值就是一個普通成員函數的地址。
如果成員函數指針聲明是一個虛函數,那它的值就有來頭了。

首先,C++標準要求:虛成員函數指針也要表現多態(tài)性,這就要求調用虛成員函數指針必須“動態(tài)的選擇函數”。但是,由于虛成員函數指針它就是就是一個值,也就說它的值必須是編譯期決定的,這是一對矛盾。

MS用了一個方法解決這個矛盾,如果源碼中出現一個虛函數指針被一個虛函數 賦值,那么 這組虛函數序列 會多生成類似
??_9@$BA@AE PROC NEAR ; `vcall', COMDAT
mov eax, DWORD PTR [ecx]
jmp DWORD PTR [eax]
的一段代碼,由這段代碼去完成運行時的多態(tài)
同時,虛成員函數指針的值也是編譯期指定的,也就是這里的??_9@$BA@AE
而源代碼中通過噓成員函數指針的調用,實際上就是??_9@$BA@AE這段代碼的調用。
  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 14:08 Kevin Lynx

@wocow3
我剛寫了點測試代碼,發(fā)現我們樓上的幾位觀點都有點小錯誤。
是的,成員函數指針比普通的指針復雜得多。例如:
class Test
{
public:
virtual void print() {}
};

printf( "%d\n", sizeof( &Test::print ) );

就以上代碼,我在VS2005下得出的結果是4(如我們所說),但是在gcc下得出的卻是8!而gcc對于一般的函數(C函數)指針卻是4.

并且,
typedef void (Test::*mem_fn_ptr)();
mem_fn_ptr p = &Test::print;
printf( "%d\n", p );
的結果在不同的編譯器上也不同,gcc得出的如我所想,是一個偏移值,而VC則始終給出一個真正的地址值。更為奇怪的是,在gcc下去掉virtual關鍵字,即讓print為一個普通函數,那么其值也為一個真正的地址值。

看來,這個面試官考的也許正是這個。無論如何,一個成員函數指針不同于普通指針。
參考:http://www.codeproject.com/KB/cpp/FastDelegate.aspx  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 14:11 everspring79

@Kevin Lynx
沒錯,這正是面試官想要得到的信息。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 14:19 wocow3

虛成員函數指針在VC下就是4字節(jié),gcc是個結構體,不同的編譯器廠商有不同的實現。
但VC用普通的指針就實現了虛成員函數指針,代價是會為用到的每組虛成員函數生成多余的代碼。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 15:25 陳梓瀚(vczh)

虛函數還是普通的指針,難道你是pfn(params)而不是pClass->*pfn(params)么?this就在這里了,是你調用的時候給他的。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 16:40 yindf

如果編譯器相關,就沒有意思了。

但我想說的是成員函數,和普通函數的區(qū)別僅有一點,就是第一個參數默認是這個類的引用,理論完畢。

VC和GCC的實現是不一樣的,其實GCC的實現更好一點。

看這個 http://www.diybl.com/course/3_program/c++/cppjs/2008109/149428.html  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 20:46 jimsmorong

還是不太明白 樓主開多個說明一下好吧  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-18 20:48 everspring79

最近比較忙,等我閑下來寫個專門的小文章解釋一下。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-19 10:05 humanchao

回答32位,其實沒有錯...
我覺得很多人面試官的動機和心態(tài)有問題,面試是一個試圖發(fā)現優(yōu)點的過程,需要必要的引導和解釋,而我們更多的發(fā)現的卻是:不想辦法把你考倒,好像證明自己很沒有水平...  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-19 10:54 夢在天涯

看來以后對這樣的問題要說明是VC還是GCC!  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-19 14:52 Alex-Lee

雖然博主沒有說的非常的明白,但是這中討論,讓大家獲益匪淺。還是不錯哦。  回復  更多評論   

# re: 面試中碰到的一個C++陷阱[未登錄] 2009-03-19 16:33

俺的blog上面有篇文章是說這個的.
這個標準沒規(guī)定,大小是多少都有可能.
比如GCC下可能是8
BCB下是12都可以.  回復  更多評論   

# re: 面試中碰到的一個C++陷阱 2009-03-23 13:16 Herb

看看底層的匯編就知道了  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费成人小视频| 欧美成人在线网站| 国产一区二区三区久久精品| 欧美日韩国产色站一区二区三区| 久久偷窥视频| 久久青青草综合| 暖暖成人免费视频| 欧美高清视频在线观看| 欧美激情精品久久久久久蜜臀| 欧美aa在线视频| 欧美日韩国产精品成人| 国产精品极品美女粉嫩高清在线| 国产精品欧美日韩久久| 国产日韩欧美一区二区三区四区| 韩国欧美一区| 99精品热视频| 香蕉乱码成人久久天堂爱免费| 亚洲欧美日韩在线综合| 久久看片网站| 亚洲黄页一区| 99成人精品| 久久精品亚洲国产奇米99| 米奇777超碰欧美日韩亚洲| 欧美日韩理论| 国产综合激情| 亚洲免费观看在线观看| 久久成人精品视频| 亚洲精品视频免费观看| 性色av一区二区三区| 欧美不卡福利| 国内精品写真在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 欧美一区2区视频在线观看| 欧美一区二区观看视频| 噜噜噜噜噜久久久久久91| 久久久亚洲国产美女国产盗摄| 欧美激情亚洲精品| 香蕉免费一区二区三区在线观看| 欧美1区3d| 韩日欧美一区| 午夜一区二区三视频在线观看| 男人插女人欧美| 欧美一级二区| 国产精品美女久久| 一本色道久久综合亚洲精品不 | 亚洲人成高清| 久久国产欧美精品| 亚洲午夜激情免费视频| 欧美黄色片免费观看| 在线观看欧美视频| 久久久www免费人成黑人精品 | 免费不卡欧美自拍视频| 国产欧美一区二区三区沐欲| 亚洲午夜激情免费视频| 亚洲精品一区在线| 欧美大片在线影院| 亚洲大胆美女视频| 另类激情亚洲| 久久久久五月天| 国产视频一区在线观看| 欧美亚洲免费| 欧美在线视频一区| 国产专区欧美精品| 久久青草久久| 久久精品国产一区二区电影| 黄色欧美日韩| 欧美成人在线网站| 欧美激情一区二区三区在线| 99视频在线精品国自产拍免费观看 | 免费在线欧美黄色| 欧美在线播放| 影音欧美亚洲| 亚洲电影免费观看高清完整版在线 | 一区二区三区四区国产| 欧美一区二区三区久久精品茉莉花| 免费看亚洲片| 老司机免费视频久久| 亚洲级视频在线观看免费1级| 亚洲成色最大综合在线| 久久国产乱子精品免费女| 亚洲午夜免费福利视频| 国产麻豆午夜三级精品| 久久久精品动漫| 欧美www视频| 亚洲午夜电影| 欧美一区二区黄色| 亚洲精品1区2区| 一本不卡影院| 国产又爽又黄的激情精品视频| 欧美国产高清| 国产精品久久一卡二卡| 蜜桃av综合| 欧美日韩一区二区三区在线看| 性欧美18~19sex高清播放| 久久久噜噜噜久久中文字免| 一区二区欧美视频| 欧美在线地址| 亚洲网站在线看| 久久亚洲视频| 午夜精品一区二区三区在线视| 久久深夜福利免费观看| 亚洲欧美日韩国产一区二区| 久久夜色精品国产| 亚欧美中日韩视频| 欧美精品在线免费播放| 久久久中精品2020中文| 国产精品第一页第二页第三页| 另类激情亚洲| 国产精品网红福利| 亚洲电影专区| 精品成人一区| 亚洲欧美日韩国产中文 | 激情综合色丁香一区二区| 日韩视频在线一区二区| 亚洲国产91| 欧美一级大片在线观看| 亚洲性夜色噜噜噜7777| 男人插女人欧美| 久久久精品国产免费观看同学 | 亚洲国产清纯| 久久成人免费电影| 欧美亚洲免费| 欧美视频免费| 亚洲精品视频在线看| 亚洲人成亚洲人成在线观看| 久久激情综合网| 久久精品国产综合| 国产欧美一区二区三区在线老狼 | 欧美伊人久久大香线蕉综合69| 国产精品一区二区久久| 午夜欧美不卡精品aaaaa| 欧美在线免费看| 欧美黄色成人网| 亚洲精品在线观| 久久精品视频在线看| 欧美成年人网| 香港成人在线视频| 欧美激情成人在线| 国产视频欧美视频| 日韩午夜剧场| 久久久国产午夜精品| 99av国产精品欲麻豆| 久久精品论坛| 在线精品福利| 国产日韩欧美一区二区三区在线观看| 欧美日韩视频| 黑丝一区二区三区| 理论片一区二区在线| 国产亚洲精品aa午夜观看| 亚洲欧美视频| 久久伊伊香蕉| 亚洲国产成人久久| 欧美高清在线播放| 亚洲乱码国产乱码精品精| 在线亚洲欧美| 国产伦精品一区二区三区照片91 | 久久久久久久网| 一区二区在线观看视频| 美女图片一区二区| 亚洲最黄网站| 久久成人免费日本黄色| 激情婷婷欧美| 欧美精品日韩精品| 亚洲永久免费观看| 免费国产一区二区| 亚洲精品在线免费| 亚洲尤物在线视频观看| 欧美一区久久| 日韩图片一区| 国产精品v日韩精品| 先锋影音网一区二区| 欧美大片在线影院| 亚洲一区国产视频| 国产深夜精品福利| 欧美黑人一区二区三区| 亚洲午夜一区| 欧美激情导航| 香蕉乱码成人久久天堂爱免费| 亚洲第一伊人| 国产精品乱码一区二三区小蝌蚪| 欧美影院成人| 亚洲精品偷拍| 狼人天天伊人久久| 亚洲在线中文字幕| 亚洲国产精品久久久久秋霞不卡| 欧美人妖另类| 久久久久欧美精品| 亚洲一区二区免费| 亚洲欧洲精品一区二区精品久久久| 亚洲一区在线免费| 亚洲欧洲日本国产| 国产亚洲欧洲一区高清在线观看| 亚洲精品欧美日韩专区| 亚洲精品国产精品乱码不99按摩| 亚洲字幕一区二区| 亚洲剧情一区二区| 在线观看日韩专区| 国产欧美精品xxxx另类| 欧美日本免费一区二区三区| 久久久久久亚洲精品不卡4k岛国|