簡體   English   中英

對於實時應用程序,哪個更好的C或C ++?

[英]For real-time application, which is better C or C++?

我是具有C語言和C ++經驗的電子工程師(我用C編寫微控制器,用C ++編寫,用Borland C ++ Builder編寫的Windows)

我公司開發電機控制產品,我們正在使用STM32和IAR編譯器。

我認識到語言之間的技術差異,我對開發海岸和代碼的維護成本感興趣:

  1. 編寫C ++代碼的開發時間是否比C長?
  2. C ++代碼的維護成本是否比C便宜? (我知道代碼總會有變化)
  3. 用C語言編寫針對C的代碼是否容易? (描述代碼如何工作的文檔)

這是非常主觀的。 個人認為使用C ++進行開發在開發時間和維護方面的成本較低,特別是對於大型復雜項目。 這是因為我見過的大多數大型復雜C項目總是以這種或那種方式最終實現C ++特性(例如多態)。 另外,我認為某些C ++特性,如命名空間,數據封裝和對象的自動初始化/破壞,增加了大型項目的可維護性; 雖然這些東西中的一些可以或多或少地被模仿到C中的不同程度的有效性。

但是,根據大量的其他因素,您的里程可能會有很大差異。 例如,如果你的編程團隊在使用C語言方面比C ++有更多的經驗,那么在C ++中可能不值得這樣做。

編寫C ++代碼的開發時間是否比C長?

這完全取決於您的程序員。 他們擅長寫C或C ++嗎?

C ++代碼的維護成本是否比C便宜? (我知道代碼總會有變化)

再次,將取決於您的程序員。 您可以使用任何語言編寫可維護或不可維護的代碼。

用C語言編寫針對C的代碼是否容易? (描述代碼如何工作的文檔)

完全取決於您的團隊和您正在使用的工具,但我想他們可能會大致相同。

總而言之,這一切都取決於你擁有的人和他們最擅長的人。 如果你試圖將一堆C程序員放在一個C ++項目上,你可能會得到一些非常糟糕的C ++。 同樣,如果你試圖將一堆C ++人員放在純C項目上。

  1. 取決於所涉團隊的經驗。 使用C ++,您可以訪問更豐富的庫函數(但在嵌入它們時要小心它們的足跡)。

  2. 精心設計的C ++代碼比C代碼更容易維護,因為它允許一些語法糖(構造函數,析構函數,RAII)。

  3. 文件的成本大致相同。

摘要

如果可以使用體面的C ++開發人員和編譯器,請堅持使用C ++。

如果沒有,那么你將不得不平衡學習曲線,項目復雜性(將通過語言適應性緩解)和可用的編譯器。

學習曲線

在C語言中,語言的學習曲線更容易:您的開發人員將更容易掌握語言的基本特征... C ++是一種更大的語言,包含C子集,模板子集和對象子集等等,每個子集與前一個完全不同。

事實上,用C ++編寫代碼效率很低很容易。 不是因為“語言很慢”,而是因為開發人員有時會以錯誤的方式編寫代碼(通常忽略C ++語言的非C部分,如引用等)。 這是“學習曲線”問題的一部分。

但是一旦“學習曲線”結束,我們就可以看一下語言特征......

語言適應性

C很直率。 要么你使用C的內置結構,要么很容易(比如,添加兩個整數......),要么你沒有,並且它將容易出錯,並且可能效率低下。

C ++可以輕松避免資源泄漏,緩沖區溢出,內存或堆棧損壞。 在C中,這幾乎可以在每行代碼中發生。

通過內聯和封裝,C ++可以輕松高效,安全地使用任何類型(即用戶定義的類型)。 使用模板和OOP,C ++可以非常容易地擴展某些類型的附加功能。

當然,所有這些都假設C和C ++將具有同樣高效的編譯器......

編譯器

C ++在編譯器上做了很多假設。 通過閱讀STL實現,您將看到許多明顯無用的函數調用,並且會懷疑所有這些“花哨”的代價。 事實上,編譯器會將它們內聯,使得生成的二進制文件更小,您認為可能。

但是如果你的編譯器無法做到這一點,那么C ++可能是一個壞主意。

結論

1 - 編寫C ++代碼的開發時間是否比C長?

這取決於項目的大小/復雜程度,以及開發人員對所選語言的熟悉程度。 如果您有C ++開發人員,請堅持使用C ++

2 - C ++代碼的維護成本是否比C便宜? (我知道代碼總會有變化)

同樣,它取決於項目的規模/復雜程度。 它越復雜,您需要的架構就越多,因此,您需要的語言支持的功能就越多,然后使用C ++。

3 - 用C語言編寫針對C的代碼是否容易? (描述代碼如何工作的文檔)

這取決於您使用的功能。 例如,與C中的等效代碼相比,使用C ++字符串是很自然的。實際上,使用復雜結構在C ++中比在C中更容易...

MyMatrix A, B, C ; // My Matrix is an user-defined object
// etc.
C = A * B ;        // If you believe this is anything but a
                   // multiplication of two matrices, then
                   // you need serious medical help.

沒有必要記錄此代碼。 每個人都知道矩陣是什么,以及乘法是什么。 C中的相同代碼會更加冗長......

但是,C ++也可能非常冗長。 沒有foreach(比如Boost.FOREACH),編寫一個循環來迭代STL容器中的每個項目可能會令人印象深刻:

for(std::map<int, std::string>::iterator it = myMap.begin(), itEnd = myMap.end() ;
    it != itEnd ;
    ++it)
{
   // Do something quite complicated...
}

當來自過程語言時,一些C ++語言特征甚至是非自然的,並且將成為學習曲線的一部分。 如果這些代碼沒有准備好,那么這種代碼的編譯器錯誤所產生的消息可能會破壞開發人員的理智。

:-)

所以它再次取決於你的開發人員對C ++的了解。

我的個人結論?

我最初是一名C開發人員。 在學習C ++之后,我發現這個語言對於我的用途來說太復雜了,但是,我認為C語言中的一些C ++功能很酷......從那時起,經過多年的經驗,我的觀點完全改變了。 我再也不能用C編碼了。

對我來說,沒有意義:當我可以選擇使用自行車,汽車,飛機甚至我的腿時,這就像限制自己騎自行車一樣。

只要您的C ++編譯器沒問題,並且您的開發人員知道C ++(或者想學習C ++),C ++就可以完成C所能做的所有事情(通常更好)以及更多(請記住,這是個人觀點)。

Post Scriptum:C ++是否用於關鍵應用程序?

顯然,C ++用於F-35(“F-22 lite”)。 以下文檔很有意思,因為它顯示了C ++的功能實際上是零成本(因此產生了積極的影響),以及C ++的哪些功能可能對軟件產生負面影響:

http://www.stroustrup.com/JSF-AV-rules.pdf

如果C ++足夠好用於這個平面 ,那么我猜C ++對很多不那么雄心勃勃的項目都有好處......

:-)

選擇已知的邪惡
如果您/您的商店在使用C方面比使用C ++有更多的經驗,請堅持使用C.我不會輕易地在關鍵任務項目中引入新技術。 大多數時候,開發人員的資格對於項目成功而言比工具集更重要。

選擇更好的工具集
在許多微控制器上,編譯器技術落后於消費者桌面平台五到十年。 一個好的編譯器會讓你不再擔心微優化,有了一個不錯的分析器(已經准備好並配備了武器),你可以跳過大量的猜測和自定義測量。

......這就是你如何使用它
在其他條件相同的情況下,這不是語言的選擇,而是你如何使用它。 C ++的性能問題非常有限:

  • 更多可用功能還意味着您可能使用的功能不正確。 有使用它們的誘惑,因為它們聽起來很酷,可能出現什么問題?
  • 還有一些事情要知道相對/絕對成本(例如成員函數調用,虛擬調用,異常......)
  • 根據其他代碼,一段代碼可能具有更多不同的含義,因此一些性能影響不像C中那樣快速可見。

所有這些都是關於開發人員的,而不是語言本身。

你提到了readtime這個詞,我理解這意味着性能對你很重要。 在這一點上,我可以說,與C和C ++相比,C ++不會產生性能損失,並且可以在操作系統內核(Symbian)中使用。

但是,C ++會提供可降低性能的習慣用法。 Getter和Setter可能會導致生成額外的代碼。 與C代碼相比,Vtable查找需要一些額外的指令。

在可維護性方面,還需要記住,系統程序員可能會更熟悉C,然后他們會使用C ++。

語言選擇與你提出的三個問題關系不大。 選擇您更有經驗的語言,這樣可以讓您更具表現力。

真的,兩者都沒有特定的優勢。 它更多地是關於你如何使用它而不是你正在使用的。

具體答案:

  1. 不,這通常取決於開發人員對語言的經驗水平。 如果他/她對C更熟悉,那么他將比C ++更快地編寫C(反之亦然)。
  2. 與上述答案相同。 維護與最初編寫的代碼質量有關,有時也與文檔質量有關。
  3. 這兩種語言的文檔語法完全相同。

由於更強大的數據類型和對象約束,你絕對應該使用C ++ :)

我認為你提到的所有三點都取決於工具支持。 由於C ++更難以解析並且更難以靜態分析,因此可能有些工具僅適用於C.

  1. 編寫C ++代碼的開發時間是否比C長?

有時。 有些實時應用程序根本無法在C ++中實現。

  1. C ++代碼的維護成本是否比C便宜? (我知道代碼總會有變化)

不,這是應用敏感的。

  1. 用C語言編寫針對C的代碼是否容易? (描述代碼如何工作的文檔)

一般來說它們相當。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM