C 的多型為什麼不在編譯期完成?

時間 2021-05-06 02:38:29

1樓:

因為做不到啊,舉個例子,抽象類A有乙個虛函式B。現在我寫乙個函式,引數是抽象類A的指標,這個函式裡面呼叫虛函式B。

那怎麼知道虛函式B是誰呢?

2樓:

Parent*p

=rand()&

1==0?

newChild1():

newChild2

();因為這種情況沒法在編譯期完成。

3樓:羊羊羊

c++有所謂編譯器多型,就是template。

一般我們說多型從其意義講顯然是執行期決定型別的,而c++對多型支援的基礎,虛表實際就是在編譯器生成好的,所以你的問題沒意義。

4樓:

因為我不知道執行期的狀態啊

拿乙個最簡單的例子:

class BaseItem;

class ItemA:BaseItem{};

class ItemB:BaseItem{};

class ItemC:BaseItemwhile(nullptr != (rawData = readRawData()))break;

case ItemTypeB:break;

case ItemTypeC:break;

default:{}

} if(nullptr != pItem)很明顯,我在編譯期是無法得知容器中物件型別的,那麼當我需要對容器中物件進行批量操作的時候,多型就是唯一的選擇了。對於最後的for迴圈,無論你做什麼,你都無法在編譯期將其展開,只能在執行期根據實際的型別情況呼叫不同的函式。

5樓:

c++能(需要)做到的是在做同樣的事時,效能不比c差。

而執行時多型是一種很常見的需求:

例如說你在實現乙個庫的api時,你根本不會知道實際傳進來的指標實際是哪個型別。

那你要實現這類多型的需求,你用c來實現,你寫出來的很可能還不如c++編譯器弄出來的。

所以,這種效能開銷的差異,本質上是需求產生的,而不是語言或者編譯器產生的。

6樓:歐文韜

c++的虛表不是和c慣用的用struct放一坨函式指標,然後另乙個struct裡存這個struct例項的指標的寫法一樣的麼。只不過乙個自動做乙個手動做而已,而且c++還可以獲得更多的型別資訊和限定來做更多的優化。

其他的像繼承和過載,就是編譯期完成的呀。

你為什麼會覺得c更快?

7樓:Star.E

std::variant

可以實現執行時多型,只是型別必須在編譯期已知,編譯後不能擴充套件型別。速度和c一樣快,不需要虛函式。支援multi-dispatch(multi-visit)

基於variant還能模擬簡單的pattern matching,極度好用

8樓:Tanki Zhang

根據實現是靜態鏈結(static dispatch)還是動態鏈結(dynamic dispatch),我們可以將多型分為靜態多型(static polymorphism)和動態多型(dynamic polymorphism)。

在 c++ 中,我們通過繼承,配合虛函式(virtual function)來實現動態多型。含有虛函式的型別將內部自帶乙個虛函式表(virtual method table, VMT),用以存放虛函式的函式指標。這使得自定義型別的例項大小有所增加,並且在執行時將額外增加從 VMT 定址,在 code memory 中跳轉的開銷。

這部分可以認為是使用 virtual 不可避免的 trade off。但是這個機制本身是完全可以在 C 中模擬的,並且模擬的效能大多數情況下很難做到比編譯器的實現和優化快。

而靜態多型的實現方法很多,例如使用奇異遞迴模板模式CRTP(Curiously recurring template pattern)。

總的來說,題主問題是偽命題。C++ 能在編譯期完成的多型都已經完成了。剩下一些依賴執行時資訊的,C艹表示無能為力。

9樓:射手老師

聽說CRTP麼,這個是可以支援編譯期多型的,執行期多型就是C++多型的目的,希望乙個基類指標可以在執行的時候指向物件A,也能指望物件B。好多設計模式都是根據這樣的多型實現的。

10樓:馮東

別覺得必須得 compile time ONLY polymorphism 才「可以和 C 的效能持平」,因為 C 也可以有執行時多型。虛函式的效能開銷是設計需求的必需元素。設計成多型的 code,用什麼語言都是 C++ 虛函式那個開銷。

平時說的 C++ 效能開銷比 C 稍大根本不是說多型方面。

舉個例子。Linux 裡的檔案系統 VFS 就是多型的例子。檔案系統的介面是統一的,不同的檔案系統 EXT4, ZFS, FAT 的驅動程式有不同的實現。

請問 compiler 怎麼在編譯 kernel 的時候知道使用者掛的什麼盤呢?

我們為什麼不能開發乙個漢語的編譯器,類似C ,java?

yyf 首先,說下我是個剛開始學習的小白 大神給些同情 我也不是標準的程式設計師,我只是萬千人中最平常的那乙個。有人說沒有必要,因為別人的成果已經很好了,我們再來開發不是浪費時間麼!但是,我想說的是,作為底層的一些東西還是自己的好。用漢語做語法,最起碼中中國人會感到親近,沒有看著就頭大的感覺,而且,...

羅素為什麼說參差多型乃是幸福的本源?

王孫歸 重點不是人與人的不同到底 好不好 而是允許這個世界存在不同的這份寬容,是幸福生活的重要條件。無論高矮胖瘦,智愚閒不肖,愛吃辣愛吃甜,在不影響他人的情況下,各得其樂,這就是幸福了。如果強行按照同一種標準來規定,那麼無論是動作的實施者和承受者,最終都不會得到快樂。你不愛吃香菜,你媽非要你吃,最後...

C語言病毒繁殖,為什麼一旦輸入93,編譯器就沒反應了?

王旭東 這題嚇死我了,尋思著有什麼程式需要在編譯的時候輸入?或者程式中乙個數字能造成編譯程式宕機?這真的是超級病毒了!題主,拜託先把一些基本概念搞搞清楚好吧!語法和演算法方面其他人都說過了,在此不表。但是好歹自己設個斷點看看呢!單步執行試試看!改變一下輸入的資料試試看!先從n比較小的數開始單步執行。...