• <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>

            EverSpring working shop

            To pursue creative ideas based on nature.

            統(tǒng)計(jì)

            留言簿(1)

            他山之石

            閱讀排行榜

            評(píng)論排行榜

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

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

            posted on 2009-03-17 22:01 everspring79 閱讀(3250) 評(píng)論(21)  編輯 收藏 引用 所屬分類(lèi): Notes

            評(píng)論

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

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

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

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

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

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

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

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

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

              回復(fù)  更多評(píng)論   

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

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

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

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

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

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

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

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


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

            等會(huì)驗(yàn)證下  回復(fù)  更多評(píng)論   

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

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

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

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

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

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

            MS用了一個(gè)方法解決這個(gè)矛盾,如果源碼中出現(xiàn)一個(gè)虛函數(shù)指針被一個(gè)虛函數(shù) 賦值,那么 這組虛函數(shù)序列 會(huì)多生成類(lèi)似
            ??_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
            而源代碼中通過(guò)噓成員函數(shù)指針的調(diào)用,實(shí)際上就是??_9@$BA@AE這段代碼的調(diào)用。
              回復(fù)  更多評(píng)論   

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

            @wocow3
            我剛寫(xiě)了點(diǎn)測(cè)試代碼,發(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(如我們所說(shuō)),但是在gcc下得出的卻是8!而gcc對(duì)于一般的函數(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è)真正的地址值。

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

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

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

            # 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à)是會(huì)為用到的每組虛成員函數(shù)生成多余的代碼。  回復(fù)  更多評(píng)論   

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

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

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

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

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

            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ù)  更多評(píng)論   

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

            還是不太明白 樓主開(kāi)多個(gè)說(shuō)明一下好吧  回復(fù)  更多評(píng)論   

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

            最近比較忙,等我閑下來(lái)寫(xiě)個(gè)專(zhuān)門(mén)的小文章解釋一下。  回復(fù)  更多評(píng)論   

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

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

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

            看來(lái)以后對(duì)這樣的問(wèn)題要說(shuō)明是VC還是GCC!  回復(fù)  更多評(píng)論   

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

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

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

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

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

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

            精品国产青草久久久久福利| 久久99精品久久久久久秒播| 久久精品成人欧美大片| 久久久精品免费国产四虎| 久久精品国产亚洲AV大全| 国产激情久久久久久熟女老人| 无码人妻少妇久久中文字幕| 久久久精品久久久久特色影视| 大香网伊人久久综合网2020| 精品水蜜桃久久久久久久| 国产亚洲精久久久久久无码AV| 久久99久久成人免费播放| 国产精品成人无码久久久久久| 久久99国产精品成人欧美| 久久青青国产| 亚洲精品无码久久千人斩| 久久99精品久久久久子伦| 久久这里只精品国产99热| 999久久久国产精品| 区久久AAA片69亚洲| 久久超乳爆乳中文字幕| 91精品无码久久久久久五月天| 亚洲国产成人乱码精品女人久久久不卡| 亚洲精品美女久久久久99小说 | 亚洲а∨天堂久久精品9966| 久久笫一福利免费导航 | 999久久久免费精品国产| 1000部精品久久久久久久久| 91性高湖久久久久| 天堂久久天堂AV色综合| 九九久久精品国产| 日韩精品久久久久久久电影蜜臀| 日本久久久久久中文字幕| 国内精品久久久久影院亚洲| 天天综合久久久网| 少妇无套内谢久久久久| 精品综合久久久久久97超人| 久久国产亚洲精品| 国内精品久久久久久不卡影院| 久久久久久久久久久久中文字幕| 久久久网中文字幕|