iostream 是 C 的缺陷嗎,為什麼?

時間 2021-05-05 17:43:42

1樓:雨花

什麼樣的工程才會讓字串輸出成為效能瓶頸.........terminal 預設是512行,但設定得再多也不可能裝下1G行,而且輸出那麼多人眼根本沒法讀。 如果是為了程序間通訊,有太多更好的辦法了。

寫檔案的話瓶頸主要是磁碟,可以開個分開的執行緒,做個非同步佇列。

2樓:

是有很大缺陷。

我在剛開始學C++的時候,就驚訝於乙個很簡單的printf對應的iostream寫法竟然這麼長,這個麼繁瑣。

在看到別人批評C++程式設計師濫用操作符過載的時候,也不禁想,標準庫裡面都胡亂過載,也難怪別人有樣學樣了。

本來覺得stringstream的存在,讓IO和格式化字串統一,是個好設計。實際用起來才發現,對於轉string這個乙個簡單的操作,這種寫法實在太麻煩。

再加上效能有問題,std::cout有狀態跟全域性變數感覺差不多,

除了type safety簡直沒有什麼優點。

當然printf有很大的問題,竟然會有「%n」這種稍微想想就有一大堆問題的東西,我只能認為是有人沒有動腦子。

3樓:王旭競

不是,標準實現和優化實現最好分開。

iostream是一套標準的開發正規化,這套模式和C++整體結合得最好,開發起來也最方便。與操作符<<、>>過載結合起來,擴充套件其他行為也最方便。這是一種最適合整體風格的工程化方案。

僅僅在速度最優化,或者單一字串列印的情況下,才需要追求其他的解決方案。

4樓:舒心

我認為iostream的出發點很好。但是最終誕生的成品卻是非常讓人失望。

讓iostream成為程式學習的範例,但這種東西沒辦法直接拿來用。因為效率實在是太低了,問題也實在是太多。

我最後選擇了這樣的道路,就是自己打造一款簡單明瞭高效能的ioc來代替iostream。

為此,我不得不:

1.自己編寫進製字串轉換函式(大部分內容是原封不動借用的陳碩先生的那本書裡講的內容)

2.自己封裝console API到乙個單一的工廠類裡(API效率就是高)

3.對各種物件進行直接例項化過載

最後這個東西實現了,效率比iostream好太多太多。缺點也有,就是自己編的不保證一點bug沒有,且有些時候不夠靈活,功能上未必覆蓋了iostream所擁有的全部功能,以及C語言的那些標準IO函式。

5樓:SuperFashi

我覺得雖然效率上的確是有區別,但以stream的方式來代表文字流實際上是非常合適的,可擴充套件性也高,也沒有老C IO那麼麻煩。

再說了C++了不搞個OO的輸入可以嗎(滑稽順便說一下速度問題,main一開始寫乙個

std::ios::sync_with_stdio(false);

cin.tie(NULL);

可以有一定幅度的速度提公升(但是千萬不能和printf/scanf混用)

6樓:李華1995號

我覺得還行吧,以前我試過在OJ平台上輸出100萬行「hello world」,cout占用的時間不多,endl倒是多用了太多時間……不過管他呢,哪有那麼多需要大量輸出的場合啊

7樓:馮東

各種語言,不論是從一開始是同意還是抵制,最後都提供了 fmt string 形式的 I/O。本身說明 fmt string 是一種經過時間檢驗的可靠方案。所謂的 type unsafe 等等 fmt string 的缺陷,其實都是紙上談兵的問題,實際工程裡根本沒那麼多問題。

為了原生而原生就沒什麼意義了。

看看 C++ FQA Lite: Input/output via &amp;amp;lt;iostream&amp;amp;gt; and &amp;amp;lt;cstdio&amp;amp;gt;

printf

("0x%08xn",x

);對比

std::cout << std::hex << std::

setfill('0') << std::setw(8) << x << std::dec << std::

endl;

更何況,在實際工程中,format string 本身就是一種不適合硬編碼的資源。把 format 嵌到語言的型別系統裡是非常不實際的。就像你要把系統的 JSON 配置嵌入到型別檢查中。

工程中本來就需要用區域性的弱型別來換取靈活性。

8樓:馬巨集菩

::ios_base

::sync_with_stdio

(false

);不過我始終覺得,把題目出到需要卡 IO 速度是不對的(題目設計水平不足的表現)……

實際使用中的其他問題,我也很推薦 @Milo Yip 答案中提到的陳碩的那篇文章。

9樓:Milo Yip

C++標準庫的stream效能比C/C++的sprintf() 差。以下是我對浮點數轉換至字串的測試:

GCC的結果中雖然兩者差距比較少,但比VC慢乙個數量級……

測試原始碼在 miloyip/dtoa-benchmark · GitHub

這個並不是完整的測試,因為還沒考慮其他資料型別。但stream的設計本身就有很多無法避免的overhead,詳細情況可參考 @陳碩的 C++ 工程實踐(7):iostream 的用途與侷限。

敝開效能方面,stream的主要好處是開放擴充套件。

10樓:高博遠

iostream效率上是足夠的,而且方便除錯(幾乎所有程式都是需要log的)。

你刷OJ刷演算法題,除了線段樹之類需要大量io的題,iostream沒什麼關係,如果他連這個都卡就真沒什麼必要了。

要知道printf畢竟屬於C library部分的東西,並不夠「原生」,而且和C++當初的設計初衷並不吻合。像是ostream可以進行自定義直接輸出物件等等,std::printf就不能夠。

為什麼 C 要搞出類似 iostream 這樣的無字尾檔案?

董曉天 這個啊由於C使用不同的副檔名來表示不同檔案型別,因此用一些特殊的副檔名 如.hpp或.hxx 表示C 標頭檔案是有道理的,ANSI ISO委員會也這樣認為。問題在於究竟使用哪種副檔名,因此最終他們一致同意不使用任何副檔名 C Primer Plus 6th 趙硯瀟 區別於C的標頭檔案啊,與W...

感性是人類缺陷嗎?

Axis 在訓練自己變得理性的過程中,越來越覺得感性是多麼珍貴的東西。感性不是放肆和沒有教養,而是在一些人和事面前更能堅守和放棄一些選擇,不為別的,只是為了內心的溫柔和憐惜。理性很有效率,可以自我保護,但不是我們能夠生存下去的理由。 未知 我也是個非常感性的人,情緒容易低落 如果原因是某件事引起,那...

長得醜是基因缺陷嗎?

我認為是的。比如我。也因此為了不把基因缺陷傳給下一代,我選擇不育。本人女。頭 腦袋大,面中部凹陷,單眼皮,近視眼,慢性鼻炎,慢性咽喉炎,嘴巴骨性地包天。聽力不佳。身材 身高151,體重常年約117斤,肚子從很小就很大,比例身長腿短 5比5 骨盆前傾。腳 扁平足,拇指外翻。沒開玩笑無需自黑 事實就是如...