2013-11-22 52 views
5

我已閱讀Bjarne Stroustrup在C++及其設計中的interview。我對他在那裏使用的術語感到困惑,所以我希望能澄清一些這樣的時刻。採訪Bjarne Stroustrup - 抽象和手工編碼

我記錄我的設計目標,並在我的書和我的兩個歷史的編程語言會議論文「C++的設計與實現」設計上的限制,但簡要地說,我的目標是爲

  • 零開銷使用的抽象時相比手工製作代碼,
  • 機器模型非常類似於的C,
  • 一個極爲靈活的一組抽象機制,和
  • 靜態TY pe安全。
  1. 什麼是「手工代碼」在這種情況下,是什麼意思?..沒有斯特勞斯 意味着一個抽象的概念的程序設計師 可以創造一些手工製作的工具?
  2. 「機器模型」在這種情況下意味着什麼?語言與硬件交互的方式?

我承擔了他提到的那本書來看看(實際上是「設計和的C進化 ++」,我認爲),但我還是不太清楚。這兩個術語也沒有很好地搜索到。

+2

可能更適合於stackExchange程序員站點,溢出涉及特定* code *相關問題。雖然希望這個問題仍然可以在這裏得到解答。 –

+0

@ Gmercer015哎呀。好的,對不起,我不知道。 – kazarey

+0

@remyabel我讀過這個。我確實明白了由手工製作的「手工製作」的意義,但我不明白的是這裏手工製作的。 – kazarey

回答

7

「機器模型」是指計算機以語言表現自己的方式。例如,C和C++以或多或少的方式處理字節,內存位置,指針,整數類型。

這裏的「手工製作」是指不使用C++中提供的抽象的等效代碼,並且以C或程序集(或C++,不包括該抽象)高效編寫。這是一個「目標」,而不是「約束」 - C++在所有情況下都沒有精確地實現它。

所以只是作爲一個例子,vector<int>並不總是精確達到相同的性能,使用mallocfree寫了一個類似的可調整大小的數組,因爲該代碼可以(而且自然不會)使用realloc在必要時調整存儲。 realloc並不經常爲您節省時間,但是當它確實節省大量時間。 vector不能這樣做,因爲分配器接口沒有任何等效於realloc,因此引入了一個小的開銷。但是幾乎所有的時間,vector的性能大致相同,所以零開銷的目標幾乎滿足。另一個例子:在發佈模式下,使用體面的C++編譯器,與編寫my_int_pointer[3]相比,編寫myvector_of_int[3]真正具有零開銷。與訪問指針類型的局部變量(my_int_pointer)相比,爲什麼訪問局部變量的數據成員(存儲在myvector_of_int中的數據指針)沒有任何開銷,但它不需要花費任何額外的費用。

+0

所以你說Bjarne的目標是**不**使用C++提供的抽象? –

+2

不,我要說的是,如果你使用抽象的話,他的目標是讓零開銷。與「手工製作」的代碼相比,開銷比較多,也就是說,代碼與抽象使用代碼具有相同的功能,但在C語言中顯式使用,而不是讓C++編譯器/庫爲您完成。 –

+0

* ooohhhh * gotcha。 –

6

通過「手工製作」的代碼,Stroustrup意味着抽象的手寫實現;例如,手工製作的for循環將是循環體的N個副本。 (請參閱Duff's Device以獲得非常重要的實現。)

通過「機器模型」,Stroustrup意味着編譯器的機器視圖。例如,C和C++提供了大致相同的字節,內存位置,內存訪問順序等視圖;相比之下,Fortran沒有任何「字節」的概念,並且內存位置(或者數組訪問,就此而言)根本不符合C/C++視圖。

+0

「一個手工製作的for循環應該是循環體的N個副本」 - 或者根據您如何看待它,手工製作的for循環將涉及C或C++中的if和goto。 ,或彙編中的條件分支。這是一個問題,你認爲抽象的重要屬性是什麼,這可能因上下文而異。 –