有關ios::sync_with_stdio(false);和 cin.tie(nullptr);的介紹與意義

總體來講它們是對C++輸入輸出流的優化(能夠提升速度),但同時也會產生必定的反作用。ios

​#include <iostream>
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ... 
}

一、ios::sync_with_stdio(false);

首先了解ios::sync_with_stdio(false);是C++的輸入輸出流(iostream)是否兼容C的輸入輸出(stdio)的開關。c++

由於C++中的std :: cin和std :: cout爲了兼容C,保證在代碼中同時出現std :: cin和scanf或std :: cout和printf時輸出不發生混亂,因此C++用一個流緩衝區來同步C的標準流。經過std :: ios_base :: sync_with_stdio函數能夠解除這種同步,讓std :: cin和std :: cout再也不通過緩衝區,天然就節省了許多時間。函數

反作用:當設置爲false時,cin就不能和scanf,sscanf, getchar, fgets等同時使用。優化

聽說,endl用」\n」代替和cout使用,也可節約時間。spa

二、cin.tie(nullptr); 

由於std :: cin默認是與std :: cout綁定的,因此每次操做的時候(也就是調用」<<」或者」>>」)都要刷新(調用flush),這樣增長了IO的負擔,經過tie(nullptr)來解除std :: cin和std :: cout之間的綁定,來下降IO的負擔使效率提高。.net

另外再提一下cin.tie(NULL);cin.tie(nullptr); 的區別。指針

nullptr是c++11中的關鍵字,表示空指針
NULL是一個宏定義,在c和c++中的定義不一樣,c中NULL爲(void*)0,而c++中NULL爲整數0
nullptr是一個字面值常量,類型爲std::nullptr_t,空指針常數能夠轉換爲任意類型的指針類型。在c++中(void *)不能轉化爲任意類型的指針,即 int *p=(void*)是錯誤的,但int *p=nullptr是正確的。緣由是對於函數重載:若c++中 (void *)支持任意類型轉換,函數重載時將出現問題。下列代碼中fun(NULL)將不能判斷調用哪一個函數

c++11

void fun(int i){cout<<"1";};
void fun(char *p){cout<<"2";};
int main()
{
fun(NULL);        //輸出1,c++中NULL爲整數0
fun(nullptr);     //輸出2,nullptr 爲空指針常量。是指針類型
}

若對NULL和nullptr仍是不太瞭解請看:它們的不一樣code

 

參考博客:https://blog.csdn.net/Canger_/article/details/85787436blog

相關文章
相關標籤/搜索