Tamponun temizlenmesi ne anlama geliyor?


99

C ++ öğreniyorum ve anlayamadığım bir şey buldum:

Çıktı arabellekleri, arabelleğin yazılmasını zorlamak için açıkça temizlenebilir. Varsayılan olarak, cinyıkamaları okumak cout; coutprogram normal şekilde bittiğinde de yıkanır.

Öyleyse arabelleği temizlemek (örneğin bir çıktı arabelleği): bu, içindeki her şeyi silerek arabelleği temizler mi yoksa içindeki her şeyi çıktı olarak arabelleği temizler mi? Yoksa tamponu temizlemek tamamen farklı bir şey mi ifade ediyor?

Yanıtlar:


125

Bir dosyaya yazmayı düşünün. Bu pahalı bir işlemdir. Kodunuzda her seferinde bir bayt yazarsanız, o zaman her bayt yazımı çok maliyetli olacaktır. Bu nedenle, performansı iyileştirmenin yaygın bir yolu, yazdığınız verileri geçici bir arabelleğe depolamaktır. Sadece çok fazla veri olduğunda dosyaya tampon yazılır. Yazmaları erteleyerek ve tek seferde büyük bir blok yazarak, performans artırıldı.

Bunu akılda tutarak, arabelleği temizlemek, verileri arabellekten dosyaya aktarma eylemidir.

Bu, içindeki her şeyi silerek arabelleği temizliyor mu yoksa içindeki her şeyi çıktısını alarak arabelleği temizliyor mu?

İkincisi.


1
Teşekkürler. bir şey daha. Cin okumak cout'u kızarır. Bu "cin okuma", kullanıcının bir şey girmesi veya kullanıcıdan bir şey girmesi istendiğinde anlamına mı geliyor?
Mohamed Ahmed Nabil

4
Cin okuma, cin'den okumak için akış operatörünü kullandığınızda gerçekleşir. Tipik olarak okurken cout'u temizlemek istersiniz, çünkü aksi takdirde girdi komut isteminden önce görünebilir.
David Heffernan

1
@DavidHeffernan Bildiğim kadarıyla cin'den önce cout'u temizlemenize gerek yok, çünkü cin ve cout bağlı (Stroustrup, C ++ Programlama Dili, [io.tie]).
sturmer

24

Cevabı aktardınız:

Çıktı arabellekleri, arabelleğin yazılmasını zorlamak için açıkça temizlenebilir.

Diğer bir deyişle, çıktının temeldeki akışa (bir dosya veya listelenen örneklerde bir uçbirim olabilir) yazılmasına neden olmak için "temizlemeniz" gerekebilir.

Genel olarak, stdout / cout satır tamponludur: siz bir satırsonu yazana veya tamponu açıkça temizleyene kadar çıktı işletim sistemine gönderilmez. Bunun avantajı, benzer bir şeyin std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl, altta yatan "dosyaya" altı yerine yalnızca bir yazmaya neden olmasıdır, bu performans için çok daha iyidir. Dezavantajı şudur:

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

std::cout << "\n";

hemen çıktı verecektir .....(tam sleepuygulama için bu soruya bakın ). Bu gibi durumlarda, << std::flushçıktının görüntülenmesini sağlamak için ek bir tane isteyeceksiniz .

Bunu yapmak için açık bir yıkamaya gerek kalmaması için okuma cinfloşları cout:

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

Bunu (int i = 0; i <5; i ++) {std :: cout << "."; uyku (1); } std :: cout << std :: endl; yazdırmıyor ..... bir kerede. Aralarında 1 milisaniye ile yazdırır. Uykuyu kullandığınızda (1000) daha fazla fark edeceksiniz
Mohamed Ahmed Nabil

@MohamedAhmedNabil sleep()(POSIX) ile Sleep()(Windows)
tc

1
Eski cevap, ancak yalnızca yorum içerikle ilgili daha az ve örnekle ilgili. coutBir ad alanıyla yeterlilik kazanıyorsunuz (yani, std::cout) ancak için bunu yapmadınız endl, bu da bu yeterliliği gerektirmelidir.
vol7ron

1
Örneğini beğendim. Ama ben endl'nin arabelleği temizlediğini düşündüm, ancak sizin örneğinizde \ n arabelleği temizliyor. Kafam karıştı.
Naz

1
@Naz \ n arabelleği boşaltmaz; arabellek sadece programın sonunda temizlenir (arabellek C ++ programlarının sonunda her zaman otomatik olarak temizlenir). \ n büyük olasılıkla sadece biçimlendirme için kullanıldı. Ayrıca, std :: endl'in tamponu temizlediği konusunda haklısınız (std :: flush da yapar, ama bu kendi kendini açıklayıcıdır).
liamnickell

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.