色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++禁用同步的方式

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

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

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

示例

為了更加直觀地來對比分析,寫了個(gè)示例,通過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

編譯,運(yùn)行之后,輸出如下:

cincost686ms
scanfcost189ms

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

sync_with_stdio

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

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

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

staticboolsync_with_stdio(bool__sync=true);

如果參數(shù)為false,則代表禁用此同步。從上面聲明可以看出,默認(rèn)情況下__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;
}

從上述代碼,進(jìn)一步驗(yàn)證了我們上面的說法,如果禁用了同步功能,則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)在,我們已經(jīng)搞清楚了為什么C++流性能要慢于C,為了驗(yàn)證是否真的是因?yàn)槭褂昧送焦δ芏鴮?dǎo)致的性能差異,使用std::sync_with_stdio(false)關(guān)閉同步,代碼示例如下:


#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

編譯,運(yùn)行后,輸出如下:

cincost178ms
scanfcost189ms

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

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

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

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

#include
#include

intmain(){
std::cout<

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

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

#include
#include

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

編譯、運(yùn)行之后,結(jié)果為a c b,與我們期望的不一致。

結(jié)語

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

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

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

    關(guān)注

    88

    文章

    3614

    瀏覽量

    93686
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73623
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68525

原文標(biāo)題:C++性能真的不如C嗎?

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    C語言實(shí)現(xiàn)面向?qū)ο蟮?b class='flag-5'>方式 C++中的class的運(yùn)行原理

    這里主要介紹下在C語言中是如何實(shí)現(xiàn)的面向?qū)ο蟆V懒?b class='flag-5'>C語言實(shí)現(xiàn)面向?qū)ο蟮?b class='flag-5'>方式,再聯(lián)想下,C++中的class的運(yùn)行原理是什么?
    發(fā)表于 10-21 09:00 ?1131次閱讀

    C++C/C++程序設(shè)計(jì)教程_C/C++概述

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

    如何提高cc++的安全編程能力?《CC++安全編碼》帶你詳細(xì)學(xué)習(xí)

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

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

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

    C++程序設(shè)計(jì)教程之C++的初步知識的詳細(xì)資料說明

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

    C語言與C++相互調(diào)用

    ? ? 1CC++相互調(diào)用 在一個(gè)嵌入式系統(tǒng)中大部分的底層和驅(qū)動層更多的是采用C語言來進(jìn)行開發(fā),而上層應(yīng)用、服務(wù)更多的采用C++等高級語言來進(jìn)行面向?qū)ο蟮确矫娴拈_發(fā)
    的頭像 發(fā)表于 01-18 11:05 ?3329次閱讀
    <b class='flag-5'>C</b>語言與<b class='flag-5'>C++</b>相互調(diào)用

    C++學(xué)習(xí)筆記之c++的基本認(rèn)識

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

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

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

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

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

    c++入門后如何進(jìn)階

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

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

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

    c++多行注釋快捷鍵

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

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

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

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

    #ifndef的方式C/C++語言標(biāo)準(zhǔn)支持。它不僅可以保證同一個(gè)文件不會被包含多次,也能保證內(nèi)容完全相同的兩個(gè)文件(或者代碼片段)不會被不小心同時(shí)包含。
    的頭像 發(fā)表于 04-19 11:50 ?605次閱讀
    主站蜘蛛池模板: 巨胸美女狂喷奶水www网麻豆| AV天堂AV亚洲啪啪久久无码| 精品国内自产拍在线观看视频| 亚洲AV久久久噜噜噜久久| 国产精品爽爽久久久久久无码| 挺进老师的紧窄小肉六电影完整版 | 臀精插宫NP文| 国产成人免费在线观看| 玩弄放荡人妻一区二区三区| 国产精品99久久久久久宅男AV| 忘忧草在线社区WWW日本直播| 国产精品一区二区AV交换| 香蕉动漫库| 激情床戏视频片段有叫声| 亚洲一区免费香蕉在线| 久久久无码精品一区二区三区| 在线少女漫画| 嫩小幼处在线| 成人AV精品视频| 无码AV动漫精品一区二区免费| 国产网址在线观看| 一本道的mv中文字幕| 老司机亚洲精品影院| eussse手机电影在线观看| 日日碰狠狠添天天爽| 国产女人乱人伦精品一区二区 | 草莓AV福利网站导航| 手机毛片免费看| 国内精品蜜汁乔依琳视频| 伊人久久精品中文字幕| 美女扒开尿孔| 大桥未久在线看| 亚洲AV午夜福利精品香蕉麻豆| 九九99亚洲精品久久久久| 18美女腿打开无遮软件| 日韩欧美精品有码在线播放| 国产网红主播精品福利大秀专区| 尤蜜网站在线进入免费| 欧美人妇无码精品久久| 国产精品大陆在线视频| 伊人大香人妻在线播放|