在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++禁用同步的方式

C語言與CPP編程 ? 來源:C語言與CPP編程 ? 作者:C語言與CPP編程 ? 2022-10-17 09:05 ? 次閱讀

恰好之前研究過這塊,所以借助本文,分析下這個問題(無意于語言之爭,單純是從技術角度)。

眾所周知,C++兼容了C的所有功能,顯然從所有角度去對比分析是不現(xiàn)實的,所以本文從我們常用的輸入輸出即標準流(iostream和stdio)的角度來分析講解。

示例

為了更加直觀地來對比分析,寫了個示例,通過scanf和cin讀文件,然后分析兩種方式的性能高低,代碼如下:

#include
#include
#include
#include
constintnum=1000000;

voidtime_report(conststd::function&f1,conststd::function&f2){
autostart=std::now();
f1();
autoend=std::now();
std::cout<(end-start).count()<(end-start).count()<>n;
}
},[](){
freopen("./data","r",stdin);
intn=0;
for(inti=0;i

編譯,運行之后,輸出如下:

cincost686ms
scanfcost189ms

從上述輸出來看,cin的耗時是scanf的3倍多,果真如此么?

sync_with_stdio

C++性能真的差C這么多嗎?直接顛覆了對C++的認知,即使性能真的低,也得知道為什么低吧,于是開始研究,發(fā)現(xiàn)C++為了兼容C,在C標準流(stdio)和C++標準流(iostrem)保持同步,這樣就可以混合使用C和C++風格的I/O,且能保證得到合理和預期的結果,而正是這個同步導致C++在cin性能上有損失。如果禁用同步,則允許C++流擁有自己的獨立緩沖區(qū),這樣性能就會提升很多。

那么是否可以禁用該同步功能呢?

C++提供了一個函數(shù)std::sync_with_stdio,聲明如下:

staticboolsync_with_stdio(bool__sync=true);

如果參數(shù)為false,則代表禁用此同步。從上面聲明可以看出,默認情況下__sync = true也就是說禁用同步,而如果__sync為false的話,則會有如下操作:

bool
ios_base::sync_with_stdio(bool__sync){
bool__ret=ios_base::_S_synced_with_stdio;

if(!__sync&&__ret){
//...
cout.rdbuf(&buf_cout);
cin.rdbuf(&buf_cin);
cerr.rdbuf(&buf_cerr);
clog.rdbuf(&buf_cerr);
//...
}
return__ret;
}

從上述代碼,進一步驗證了我們上面的說法,如果禁用了同步功能,則C++流使用自己的緩沖區(qū)buf_cin(此處以cin為例),幾種buffer的定義如下:

typedefcharfake_filebuf[sizeof(stdio_filebuf)]
__attribute__((aligned(__alignof__(stdio_filebuf))));
fake_filebufbuf_cout;
fake_filebufbuf_cin;
fake_filebufbuf_cerr;

好了,截止到現(xiàn)在,我們已經搞清楚了為什么C++流性能要慢于C,為了驗證是否真的是因為使用了同步功能而導致的性能差異,使用std::sync_with_stdio(false)關閉同步,代碼示例如下:


#include

#include #include #include constintnum=1000000; voidtime_report(conststd::function&f1,conststd::function&f2){ autostart=std::now(); f1(); autoend=std::now(); std::cout<(end-start).count()<(end-start).count()<>n; } },[](){ freopen("./data","r",stdin); intn=0; for(inti=0;i

編譯,運行后,輸出如下:

cincost178ms
scanfcost189ms

可以看出禁用同步后,二者的性能基本一致。

既然禁用同步后,C++流的性能與C基本一致,那么是否直接禁用呢?答案是依賴于具體的使用場景。

1、同步的C++流是線程安全的,也就說來自不同線程的輸出可能會交錯,但數(shù)據不會產生競爭,而如果禁用同步,則可能出現(xiàn)意想不到的結果。

2、如果禁用了同步功能,輸入輸出順序可能會得不到我們想要的結果。

#include
#include

intmain(){
std::cout<

上述代碼執(zhí)行后,輸出a b c ,符合我們的預期。

如果加上禁用同步代碼,如下:

#include
#include

intmain(){
std::sync_with_stdio(false);
std::cout<

編譯、運行之后,結果為a c b,與我們期望的不一致。

結語

如果使用C編程,那么使用C stdio,而如果使用C++編程,則建議使用C++ I/O。如果在某些特殊場景下,需要混合使用,那么強烈建議不要禁用同步,否則會得到意想不到的結果。

好了,今天的文章就到這,我們下期見!

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3634

    瀏覽量

    93855
  • C++
    C++
    +關注

    關注

    22

    文章

    2113

    瀏覽量

    73742
  • 代碼
    +關注

    關注

    30

    文章

    4809

    瀏覽量

    68816

原文標題:C++性能真的不如C嗎?

文章出處:【微信號:C語言與CPP編程,微信公眾號:C語言與CPP編程】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言與C++的區(qū)別

    在很大程度上,C++C的超集,這意味著一個有效的C程序也是一個有效的C++程序。
    發(fā)表于 09-16 10:20 ?1176次閱讀

    C語言實現(xiàn)面向對象的方式 C++中的class的運行原理

    這里主要介紹下在C語言中是如何實現(xiàn)的面向對象。知道了C語言實現(xiàn)面向對象的方式,再聯(lián)想下,C++中的class的運行原理是什么?
    發(fā)表于 10-21 09:00 ?1151次閱讀

    C++C/C++程序設計教程_C/C++概述

    C++基礎知識,簡要介紹了C++的一些簡單知識,概念,函數(shù)
    發(fā)表于 12-25 10:15 ?0次下載

    如何提高cc++的安全編程能力?《CC++安全編碼》帶你詳細學習

    ,既詳細闡述了C/C++語言及其相關庫固有的安全問題和陷阱,系統(tǒng)總結了導致軟件漏洞的各種常見編碼錯誤,并給出了應對錯誤的解決方案;又對C/C++軟件中常見漏洞的危害、被利用
    發(fā)表于 08-28 08:00 ?0次下載

    VISUAL C++教程之VISUAL C++的安裝和使用方法

    本文檔的主要內容詳細介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費下載。
    發(fā)表于 12-27 16:32 ?19次下載
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法

    C++程序設計教程之C++的初步知識的詳細資料說明

    C++程序設計教程之C++的初步知識的詳細資料說明包括了:1. 從CC++,2 . 最簡單的C++程序,3 .
    發(fā)表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>的初步知識的詳細資料說明

    C語言與C++相互調用

    ? ? 1CC++相互調用 在一個嵌入式系統(tǒng)中大部分的底層和驅動層更多的是采用C語言來進行開發(fā),而上層應用、服務更多的采用C++等高級語言來進行面向對象等方面的開發(fā)
    的頭像 發(fā)表于 01-18 11:05 ?3363次閱讀
    <b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>相互調用

    C++學習筆記之c++的基本認識

    自這篇文章我們即將開始C++的奇幻之旅,其內容主要是讀C++ Primer的總結和筆記,有興趣可以找原版書看看,對于學習C++還是有很大幫助的。這篇文章將從一個經典的程序開始介紹C++
    的頭像 發(fā)表于 03-17 13:57 ?751次閱讀

    C/C++編譯器的缺省字節(jié)對齊方式

    C/C++編譯器的缺省字節(jié)對齊方式為自然對界。即在缺省情況下,編譯器為每一個變量或是數(shù)據單元按其自然對界條件分配空間。
    的頭像 發(fā)表于 04-15 11:24 ?1052次閱讀

    淺談C語言與C++的前世今生

    C++開發(fā)人員將有這些問題歸咎于C,而C開發(fā)人員則認為C++過于瘋狂。我覺得站在C的角度看C++
    發(fā)表于 05-26 09:27 ?483次閱讀
    淺談<b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>的前世今生

    c++入門后如何進階

    C++11 是下一個 C++ 標準,但我們通常稱之為現(xiàn)代 C++。現(xiàn)代 C++ 也包括了 C++14 和
    發(fā)表于 07-21 08:56 ?355次閱讀
    <b class='flag-5'>c++</b>入門后如何進階

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點問題,讓大家領略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?896次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    c++多行注釋快捷鍵

    C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個語句的方法。當你希望暫時禁用一些代碼或者解釋特定部分代碼的作用時,多行注釋是非常有用的。 在C++中,多行注釋以 /* 開始,以
    的頭像 發(fā)表于 11-22 10:24 ?8588次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?634次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    C/C++中兩種宏實現(xiàn)方式

    #ifndef的方式C/C++語言標準支持。它不僅可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發(fā)表于 04-19 11:50 ?677次閱讀
    主站蜘蛛池模板: 人人搞人人搞| 日韩在线影院| 性欧美xxxx视频| 美国bj69video18视频| 91精品日本久久久久久牛牛| 午夜在线影视| 天天天射| 亚洲第一综合| 天天摸天天做天天爽天天弄| 欧美午夜精品一区二区三区| 一级毛片在线播放| 国产三级观看| 久久综合九色综合97婷婷群聊| 色女人天堂| 五月婷婷六月天| 成人久久久精品乱码一区二区三区| 丁香欧美| 热99久久| 亚洲 欧美 综合| 日本特级视频| 国模精品视频| 国产一区二区三区在线观看影院| 成人在线视频网| 丁香花高清在线观看| 真实的国产乱xxxx在线| 天堂在线网站| 天天视频观看| 国产精品资源在线观看| 中文字幕亚洲一区二区v@在线| 黄色网址在线播放| 老师喂我吃她的奶水脱她胸罩| 婷婷香蕉| 日本吻胸抓胸激烈视频网站| 久久婷婷国产精品香蕉| 一级黄色片a| www日| 男男扒开后菊惩罚| 最近2018中文字幕2019高清| a成人| 日本黄色激情视频| 成年人网站免费观看|