Trước tiên, không yêu cầu rằng std::cout
(hoặc thậm chí std::cerr
) là không bị chặn. Yêu cầu duy nhất là std::cerr
có std::basic_ios::unitbuf
thiết lập (để nó sẽ tuôn ra ở cuối mỗi chức năng đầu ra: <<
hoặc chức năng đầu ra không được định dạng). Trên Mặt khác, trừ khi bạn đã gọi std::basic_ios::sync_with_stdio(false)
, outputting đến suối C++ và xuất để tương ứng C suối (ví dụ: std::cout
và stdout
) phải có những tác động tương tự. Về lý thuyết, điều này có thể được thực hiện bằng nhiều cách: stdout
chức năng có thể mong muốn những std::cout
, std::cout
sản lượng có thể chuyển tiếp để stdout
, hoặc họ có thể chia sẻ một số thực hiện đệm thông thường dưới mui xe. Trong thực tế, thực tế tất cả các triển khai đều có std::cout
chuyển tiếp đến stdout
.
C xác định rằng stderr
không được đệm đầy đủ, và điều đó có thể stdout
được đệm đầy đủ chỉ khi nó có thể được xác định không đề cập đến một thiết bị tương tác (đối với một số thực hiện được xác định ý nghĩa của "thiết bị tương tác"). Thông thường, stdout
sẽ là dòng đệm (khái niệm không tồn tại trong iostream) và stderr
sẽ là không bị chặn, nhưng điều đó không được đảm bảo theo tiêu chuẩn C (và có thể không phải là đúng ngày hôm nay — lần cuối cùng tôi thực sự xem đã hơn hai mươi năm trước đây). Dù sao, việc triển khai chỉ cần chuyển tiếp đến stdout
sẽ thực hiện theo các quy tắc của việc triển khai C mà nó chuyển tiếp và một trong đó doesnt 'vẫn cần thực hiện một số bước để đảm bảo rằng đầu ra là std::cout
và stdout
xuất hiện theo đúng thứ tự, và rằng stdout
hoạt động "như thể" nó tuân thủ các quy tắc C.
Nếu bạn lo lắng về hiệu suất, thì bạn có thể muốn chạy một số thử nghiệm . Hãy thử đo thời gian cần để xuất ra một số std::ofstream
bạn đã tự mở, so với thời gian cần để xuất ra std::cout
(cả có và không có gọi là sync_with_stdio
), với đầu ra được chuyển hướng. Sự khác biệt nên thú vị.
Nguồn
2014-11-17 16:03:55
Điều này có một số thông tin: http://stackoverflow.com/questions/11392511/c-buffered-stream-io – stijn