c 的zero overhead abstraction是什麼?

時間 2021-05-30 23:35:32

1樓:CNife

我的理解,所謂「零成本抽象」有兩個層面的意思。

不需要為沒有使用到的語言特性付出代價。

使用某種語言特性,不會帶來執行時的代價。

總的來說,這就是一種極度強調執行時效能,把所有解釋抽象的工作都放在編譯時完成的思路。

用物件記憶體布局舉例,對於乙個類,如果沒有定義任何虛函式,也沒有繼承任何定義了虛函式的類,那麼這個類的物件在記憶體中的布局與 C 語言的 struct 基本就是一致的,沒有多餘的虛表。

——你沒有用到虛函式帶來的執行時多型特性,就不需要付出虛表帶來的執行時開銷。

——你用到了「用類來抽象資料」這個特性,它沒有帶來任何額外的執行時開銷,跟你分別單獨操縱類的成員是一樣的效率。

「零成本抽象」是一種語言特性的標準,C++ 有的特性是零成本的,但並不是所有的特性都是零成本的,比如剛才提到的虛表。

也不是說只要是「零成本抽象」就是好的語言特性,有些語言特性必須拿到執行時的資訊(比如動態分派),有些語言特性做在執行時比編譯時更好(比如真泛型),還有的語言特性帶來的執行時開銷小到可以忽略(比如已經比較成熟了的異常機制),就不需要做成「零成本抽象」,把所有工夫都趕在編譯時完成。

既然c 是c的超集,那c相對於c 的優勢在哪,為什麼c的編譯器沒有被淘汰?

我知道老師可能跟你們說c艹是c的超集,但真不是這樣。c艹還因為雜亂被人各種吐槽不如c。為人詬病的地方挺多的,知乎一搜就有,總得來說確實web都用指令碼語言,底層用c。話又說回來了,高中生物不是還把細胞核不當細胞器來著,大學老師說的話留個心眼,好多沒去企業工作過,只教書的。 涇渭漳淮 看幾個回答,似乎...

Backbone js 的 MVC 中 C 所指的 collection 和傳統 MVC 框架中的 controller 的關係是什麼?

Backbone.js 的 MVC 事實上應該是BB是傾向於MVP Collection其實是model的複數級別罷了。感覺AngularJS更喜歡些 tianlu 剛提出這個問題,就發現 Backbone 在文件裡稍微解釋了這個問題,那便翻譯過來吧。Backbone 與傳統的 MVC 模式之間聯絡...

相容 C 是否成為了 C 的包袱?

Ivan Lu 相容C語言的話,你做OJ時候就可以不用iostream的格式控制符然後直接混用ptintf 2f 這樣的豈不美滋滋 其實我不會ios控制,逃 熊起 雖然學習C 是我碼農生涯的開始,但是如果現在C 不相容C的話,我寧願選擇用lua之類指令碼語言帶個C編譯器。除非有針對C這個定位的其他工...