2016-12-27 27 views
5

C++ iostreams cung cấp quyền kiểm soát xem luồng C++ có được đồng bộ với luồng C qua std::ios_base::sync_with_stdio() hay không. Tắt đồng bộ hóa luồng cho phép triển khai thư viện chuẩn sử dụng bộ đệm không đồng bộ độc lập cho luồng C++ và luồng C để có khả năng cải thiện hiệu suất.Lợi ích tiềm năng của việc cho phép các luồng C++ và C có thể đệm một cách độc lập là gì?

Tại sao nó được coi là quan trọng để mở cửa cho người triển khai sử dụng bộ đệm io độc lập riêng biệt cho luồng C và C++? Tôi không thấy làm thế nào điều này có khả năng có thể cải thiện hiệu suất so với một bộ đệm io. Cho phép thư viện chuẩn một bộ đệm io ở cấp độ chương trình có thể giảm số lượng cuộc gọi thường tốn kém đến các cơ sở OS io cơ bản, nhưng điều gì có thể là lợi thế của hai bộ đệm io?

Có lý do kỹ thuật nào cho các bộ đệm riêng biệt cho luồng C và C++ có thể mang lại hiệu suất hay thiết kế chỉ là một tạo tác lịch sử?

Có phải bằng cách nào đó phải làm với ủy ban muốn người triển khai C++ có thể triển khai thư viện chuẩn C++ bằng cách xây dựng dựa trên các triển khai thư viện chuẩn C hiện có của họ?


Tôi đang tìm kiếm nhiều hơn "tiêu chuẩn nói như vậy".

Nếu đặc điểm hệ điều hành là cần thiết để giải thích lý do, câu trả lời được sử dụng làm ví dụ về cơ sở io được cung cấp bởi hệ điều hành thực hoặc để giải thích một hệ điều hành giả thuyết, nhưng hợp lý.


Edit: Để làm rõ, câu hỏi không được lý do tại sao dòng đồng bộ nên ì ạch hơn. Câu hỏi đặt ra là tại sao tiêu chuẩn C++ được thiết kế với giả định rằng có thể có hai bộ đệm io ở tất cả và tại sao lại để khả năng mở đó hữu ích cho người thực hiện. std::ios_base::sync_with_stdio() chỉ xảy ra là hậu quả của giả định này.

Trả lời

4

Không giống như một số tiêu chuẩn được viết để quy định hành vi của những thứ chưa được xây dựng, tiêu chuẩn C++, như tiêu chuẩn C, được viết để mô tả hành vi của những thứ mà đã tồn tại. Các tác giả của tiêu chuẩn muốn tránh bất kỳ thứ gì gây khó khăn cho việc thiết kế một thực thi C++ phù hợp cho một nền tảng sẽ hoạt động tốt như các triển khai chuẩn trước đó cho nền tảng đó.

Nếu có một số triển khai có dòng C++ hỗ trợ một số chức năng nền tảng bổ sung không được tiêu chuẩn bắt buộc, có thể không thực hiện được C++ phù hợp để hỗ trợ đồng thời các chức năng đó. C's <stdio.h> gói. Nó có thể là không thể cho các tác giả của các tiêu chuẩn để tránh hoặc đòi hỏi rằng việc triển khai không có khả năng hỗ trợ ngữ nghĩa nâng cao như vậy hoặc khác cho phép họ đệm các dòng của họ độc lập với những người của <stdio.h>. Do không có gì ngăn cản việc triển khai cụ thể từ việc đảm bảo rằng cả hai thư viện sẽ sử dụng cùng một bộ đệm cho dù tiêu chuẩn có yêu cầu hay không, lựa chọn thứ hai sẽ có ý nghĩa nếu có khả năng yêu cầu mạnh hơn sẽ có bất kỳ tính năng triển khai hữu ích nào.

+0

Điều này nghe giống như câu trả lời đúng, nhưng bạn có thể cụ thể hơn về những gì có thể là không thể hoặc đưa ra một ví dụ? (Ví dụ, một ví dụ hợp lý) – Praxeolitic

+0

@Praxeolitic: Ví dụ đơn giản, ai đó viết một '' có thể cung cấp một luồng tương tự 'ungetc()' có thể đẩy lùi nhiều ký tự ngay cả khi đầu vào là một đường ống hoặc ổ cắm.Nếu triển khai '' không cung cấp bất kỳ tính năng nào như vậy, mã luồng có thể theo dõi các ký tự được đẩy lùi và để chúng xuất hiện vào lần nhập liệu tiếp theo từ luồng, nhưng sẽ không có cách nào cho dữ liệu đó xuất hiện nếu mã cố gắng 'fread' từ tệp cơ bản. – supercat

+0

Nó có vẻ giống như một đoạn mà tiêu chuẩn dự định để phù hợp với độ lệch này nhiều từ tiêu chuẩn (tiêu đề có tên là "iostreams.h", mở rộng không chuẩn cho iostreams, không có 'ungetc()'). Bạn có thể chỉ ra bất kỳ bằng chứng nào cho thấy ủy ban quan tâm đến việc triển khai "quasi-conforming" không? Thêm vào đó, nếu chúng ta giả sử rằng việc triển khai iostream và stdio bằng cách nào đó về cơ bản không tương thích, điều này có làm cho việc đồng bộ hóa không thể được không? – Praxeolitic

Các vấn đề liên quan