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

EverSpring working shop

To pursue creative ideas based on nature.

統(tǒng)計(jì)

留言簿(1)

他山之石

閱讀排行榜

評論排行榜

面試中碰到的一個(gè)C++陷阱

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

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

評論

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

那我告訴你,你現(xiàn)在的想法依然是錯(cuò)的

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

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

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

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

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

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

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

  回復(fù)  更多評論   

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

@xxxx
哈哈,其實(shí)成員函數(shù)指針不是普通意義上的指針,是個(gè)結(jié)構(gòu),可能包含指針或者偏移信息,而且應(yīng)不同的編譯器而不同,你還是研究下再來說我的想法是錯(cuò)的。當(dāng)然我文中的表述并不精確。
我想面試官當(dāng)時(shí)的目的是想我能表達(dá)出虛函數(shù)指針與普通函數(shù)指針的不同,虛函數(shù)指針并非傳統(tǒng)意義上的指針。  回復(fù)  更多評論   

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

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

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

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

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

6.函數(shù)與虛函數(shù)
編譯器為每個(gè)有虛函數(shù)的類都建立一個(gè)虛函數(shù)表(其大小不計(jì)算在類中),并為這個(gè)類安插一個(gè)指向虛函數(shù)表的指針,即每個(gè)有虛函數(shù)的類其大小至少為一個(gè)指針的大小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 (內(nèi)含一個(gè)int,普通函數(shù)不占大小)
sizeof (B) = 8 (一個(gè)int ,一個(gè)虛函數(shù)表指針)
sizeof (C) =12 (一個(gè)int ,一個(gè)虛函數(shù)表指針,一個(gè)char ,再加上數(shù)據(jù)對齊)
sizeof (D) = 8 (一個(gè)int ,一個(gè)虛函數(shù)表指針,多個(gè)虛函數(shù)是放在一個(gè)表里的,所以虛函數(shù)表指針只要一個(gè)就行了)
sizeof (E) = 1 (static 函數(shù)不占大小,空類大小為1)


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

等會驗(yàn)證下  回復(fù)  更多評論   

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

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

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

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

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

首先,C++標(biāo)準(zhǔn)要求:虛成員函數(shù)指針也要表現(xiàn)多態(tài)性,這就要求調(diào)用虛成員函數(shù)指針必須“動態(tài)的選擇函數(shù)”。但是,由于虛成員函數(shù)指針?biāo)褪蔷褪且粋€(gè)值,也就說它的值必須是編譯期決定的,這是一對矛盾。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果編譯器相關(guān),就沒有意思了。

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

VC和GCC的實(shí)現(xiàn)是不一樣的,其實(shí)GCC的實(shí)現(xiàn)更好一點(diǎn)。

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

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

還是不太明白 樓主開多個(gè)說明一下好吧  回復(fù)  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美不卡视频| 久久精品国产亚洲一区二区三区| 欧美激情一区二区三区不卡| 欧美一区在线视频| 国产麻豆精品theporn| 亚洲深夜福利视频| 欧美精品日韩一本| 99精品国产高清一区二区| 欧美激情一区二区三区在线| 老司机免费视频久久| 在线看日韩欧美| 女人香蕉久久**毛片精品| 久久亚洲综合网| 亚洲精品欧美在线| 欧美日韩国产一区精品一区 | 欧美激情国产精品| 久久综合伊人77777| 亚洲国产欧美另类丝袜| 欧美激情一二区| 欧美精品国产精品日韩精品| 99精品久久久| 久久成人免费视频| 欧美一区二区三区播放老司机| 亚洲欧美日韩国产| 欧美国产日产韩国视频| 一本久久综合| 亚洲视频免费看| 国产欧美日韩在线播放| 久久精品99国产精品酒店日本| 久久aⅴ国产欧美74aaa| 极品中文字幕一区| 亚洲国产精品电影| 欧美精品在线观看一区二区| 嫩草影视亚洲| 国产精品视频| 久久亚洲欧美国产精品乐播| 麻豆成人小视频| 一本色道久久综合亚洲精品高清| 一区二区三区国产在线观看| 国产欧美一区二区精品性| 久久久久9999亚洲精品| 久久久免费精品视频| 亚洲美女视频网| 中文在线不卡| 一区二区三区在线免费观看| 亚洲国产高清在线| 欧美天堂亚洲电影院在线观看 | 99热这里只有精品8| 99在线热播精品免费| 国产日韩一区| 亚洲高清久久网| 国产精品久久久久国产a级| 久久久久久久成人| 欧美精品18videos性欧美| 亚洲欧美中文日韩在线| 久久久精品欧美丰满| 一区二区免费在线播放| 香蕉成人啪国产精品视频综合网| 亚洲电影中文字幕| 中文日韩在线| 亚洲国产成人久久综合一区| a91a精品视频在线观看| 国模一区二区三区| 亚洲免费电影在线| 狠狠色综合播放一区二区| 亚洲精品国产精品国产自| 国产午夜精品全部视频在线播放| 欧美黄色日本| 国产精品永久免费视频| 亚洲电影免费| 国产午夜精品一区理论片飘花| 亚洲国产精品精华液网站| 国产精品综合网站| 最新亚洲激情| 国语自产在线不卡| 在线一区观看| 亚洲啪啪91| 欧美专区中文字幕| 亚洲夜间福利| 欧美mv日韩mv国产网站app| 久久精品国产96久久久香蕉| 欧美日韩成人| 欧美1区2区3区| 国产视频在线一区二区 | 亚洲国产精品尤物yw在线观看| 国产精品素人视频| 亚洲激情啪啪| 在线观看精品一区| 亚洲欧美在线x视频| 一区二区欧美日韩| 美女视频网站黄色亚洲| 久久精品女人天堂| 国产精品mm| 亚洲人成毛片在线播放女女| 在线观看91精品国产麻豆| 亚洲欧美日韩在线高清直播| 中国日韩欧美久久久久久久久| 老司机午夜精品| 久久九九精品99国产精品| 国产精品久久久久久久久| 亚洲欧洲在线看| 亚洲成色777777女色窝| 欧美亚洲日本网站| 亚洲欧美日韩直播| 欧美日韩在线播放一区| 91久久久亚洲精品| 亚洲国产高清一区| 久久米奇亚洲| 久久婷婷国产麻豆91天堂| 国产老肥熟一区二区三区| 中国亚洲黄色| 亚洲永久免费| 欧美三区在线视频| 亚洲精品一二三| 日韩一级黄色av| 欧美激情精品久久久| 亚洲电影免费观看高清完整版| 一区二区视频免费在线观看| 欧美一区亚洲一区| 久久精品理论片| 国产午夜精品美女毛片视频| 亚洲欧美日韩中文视频| 性色av一区二区三区在线观看| 国产精品激情| 亚洲视频在线免费观看| 亚洲自拍偷拍色片视频| 国产精品v欧美精品v日本精品动漫| 亚洲精品美女久久久久| 日韩一级网站| 欧美日韩国产综合网| 亚洲精品久久久久久久久久久久| 日韩视频不卡| 欧美人成免费网站| 亚洲麻豆av| 亚洲一区国产精品| 国产精品久久7| 亚洲伊人久久综合| 久久精品国产亚洲一区二区三区| 国产农村妇女毛片精品久久莱园子| 亚洲桃花岛网站| 欧美一区免费| 激情久久久久久久久久久久久久久久| 久久精品网址| 欧美激情一区二区三级高清视频| 亚洲欧洲日本国产| 欧美精品国产| 亚洲性夜色噜噜噜7777| 欧美在线观看日本一区| 国产一区二区三区在线观看精品 | 狠狠色丁香久久婷婷综合丁香| 欧美一区二区三区啪啪| 久久视频一区二区| 亚洲经典在线| 欧美日韩精品一区二区天天拍小说| 一区二区三区视频在线观看| 香蕉尹人综合在线观看| 国产专区精品视频| 久久综合电影| 日韩午夜激情| 欧美一区二区三区免费大片| 韩国久久久久| 欧美国产成人精品| 亚洲私人影院| 久久亚裔精品欧美| 日韩视频精品| 国产精品综合色区在线观看| 久久久人成影片一区二区三区| 亚洲激情在线| 性色av一区二区三区在线观看| 激情一区二区| 欧美精品18+| 午夜伦欧美伦电影理论片| 欧美.日韩.国产.一区.二区| av成人动漫| 国产欧美精品一区aⅴ影院| 久久一区二区三区av| 亚洲免费观看视频| 久久久久久久网站| 夜色激情一区二区| 国产亚洲综合性久久久影院| 欧美成人午夜剧场免费观看| 亚洲视频福利| 欧美不卡视频一区| 亚洲影视在线播放| 亚洲大胆av| 国产精品久久77777| 久久在线免费| 亚洲桃花岛网站| 欧美丰满少妇xxxbbb| 亚洲中字黄色| 亚洲国产婷婷综合在线精品 | 欧美影院一区| 亚洲精品一区二区三| 国产麻豆9l精品三级站| 欧美国产视频一区二区| 性欧美大战久久久久久久免费观看| 亚洲国产精品一区二区尤物区| 久久国产精品亚洲va麻豆| 亚洲伦理在线观看| 国产一区亚洲一区|