Xả bộ đệm nghĩa là gì?


95

Tôi đang học C ++ và tôi đã tìm thấy điều gì đó mà tôi không thể hiểu được:

Bộ đệm đầu ra có thể được xóa một cách rõ ràng để buộc ghi bộ đệm. Theo mặc định, đọc cintuôn ra cout; coutcũng được tuôn ra khi chương trình kết thúc bình thường.

Vì vậy, làm sạch bộ đệm (ví dụ một bộ đệm đầu ra): điều này có xóa bộ đệm bằng cách xóa mọi thứ trong đó hay nó xóa bộ đệm bằng cách xuất mọi thứ trong đó? Hay xả bộ đệm có nghĩa là một cái gì đó hoàn toàn khác?

Câu trả lời:


122

Cân nhắc việc ghi vào một tệp. Đây là một hoạt động tốn kém. Nếu trong mã của bạn, bạn viết từng byte một, thì mỗi lần ghi một byte sẽ rất tốn kém. Vì vậy, một cách phổ biến để cải thiện hiệu suất là lưu trữ dữ liệu bạn đang viết trong một bộ đệm tạm thời. Chỉ khi có nhiều dữ liệu thì bộ đệm mới được ghi vào tệp. Bằng cách hoãn ghi và viết một khối lớn trong một lần, hiệu suất sẽ được cải thiện.

Với ý nghĩ này, xả bộ đệm là hành động chuyển dữ liệu từ bộ đệm sang tệp.

Điều này có xóa bộ đệm bằng cách xóa mọi thứ trong đó hay xóa bộ đệm bằng cách xuất mọi thứ trong đó?

Sau này.


1
Cảm ơn. một điều nữa. Đọc cin tuôn ra cout. Điều này "đọc cin" có nghĩa là khi người dùng nhập một cái gì đó hoặc khi người dùng được nhắc nhập một cái gì đó?
Mohamed Ahmed Nabil

4
Đọc cin xảy ra khi bạn sử dụng toán tử dòng để đọc từ cin. Thông thường, bạn muốn làm phẳng cout khi đọc vì nếu không thì đầu vào có thể xuất hiện trước lời nhắc.
David Heffernan

1
@DavidHeffernan Theo như tôi biết, bạn không bao giờ cần phải tuôn ra cout trước cin, bởi vì cin và cout gắn liền với nhau (Stroustrup, Ngôn ngữ lập trình C ++, [io.tie]).
cứng hơn

24

Bạn đã trích dẫn câu trả lời:

Bộ đệm đầu ra có thể được xóa một cách rõ ràng để buộc ghi bộ đệm.

Có nghĩa là, bạn có thể cần phải "xả" đầu ra để ghi nó vào luồng bên dưới (có thể là một tệp hoặc trong các ví dụ được liệt kê, một thiết bị đầu cuối).

Nói chung, stdout / cout là dòng đệm: đầu ra không được gửi đến HĐH cho đến khi bạn viết một dòng mới hoặc xóa bộ đệm một cách rõ ràng. Ưu điểm là một cái gì đó như std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endlchỉ gây ra một lần ghi vào "tệp" bên dưới thay vì sáu lần, điều này tốt hơn nhiều cho hiệu suất. Điểm bất lợi là một mã như:

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

sẽ xuất ra .....cùng một lúc (để sleepthực hiện chính xác , hãy xem câu hỏi này ). Trong những trường hợp như vậy, bạn sẽ muốn một phần bổ sung << std::flushđể đảm bảo rằng đầu ra được hiển thị.

Đọc cinbừng coutvì vậy bạn không cần một tuôn ra rõ ràng để làm điều này:

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

Thực hiện việc này for (int i = 0; i <5; i ++) {std :: cout << "."; ngủ (1); } std :: cout << std :: endl; không in ..... cùng một lúc. Nó in chúng với 1 mili giây ở giữa. Bạn sẽ nhận thấy nó nhiều hơn khi bạn sử dụng giấc ngủ (1000)
Mohamed Ahmed Nabil

@MohamedAhmedNabil Có vẻ như bạn đang nhầm lẫn sleep()(POSIX) với Sleep()(Windows)
tc.

1
Câu trả lời cũ, nhưng chỉ nhận xét là ít hơn về nội dung và nhiều hơn về ví dụ. Bạn đủ điều kiện coutvới một không gian tên (tức là, std::cout) nhưng không làm như vậy đối với endl, mà cũng sẽ yêu cầu điều kiện đó.
vol7ron

1
Tôi thích ví dụ của bạn. Nhưng tôi nghĩ endl làm sạch bộ đệm, nhưng trong ví dụ của bạn, \ n làm sạch bộ đệm. Tôi bị bối rối.
Naz

1
@Naz \ n không làm sạch bộ đệm; bộ đệm chỉ được xả vào cuối chương trình trong ví dụ của anh ấy (bộ đệm luôn tự động được xả khi kết thúc chương trình C ++). \ n có thể chỉ được sử dụng để định dạng. Ngoài ra, bạn đã đúng khi std :: endl làm sạch bộ đệm (std :: flush cũng vậy, nhưng điều đó tự giải thích).
liamnickell

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.