Nie mam specyficznego kontekstu, w którym zadaję to pytanie, ale podczas czytania książki dla początkujących na C ++ zauważyłem użycie zarówno manipulatora strumienia endl, jak i znaku zmiany linii podczas obchodzenia się z obiektem strumienia.
Przykład jest następujący:
cout << "Hello World" << endl;
cout << "Hello World\n";
Moje pytania to:
- Czy bardziej odpowiednie jest użycie manipulatora strumienia (endl) w określonej sytuacji i znaku ucieczki w innej?
- Czy są wady wydajności, jeśli chodzi o użycie jednego z dwóch?
- Czy są one całkowicie wymienne?
- Przeczytałem, że sekwencja ucieczki jest przechowywana w pamięci jako pojedynczy znak. Czy to oznacza, że bardziej odpowiednie jest użycie endl, jeśli masz mało pamięci?
- Czy manipulator strumienia ostatecznie zużywa pamięć w jakikolwiek sposób, jeśli tak, to czy jest to coś więcej niż sekwencja ucieczki?
Dzięki, StackExchange przeprosiny, jeśli opublikowałem to w niewłaściwej sekcji, pomyślałem, że liczy się to jako struktury danych.
c++
data-structures
king9x
źródło
źródło
Odpowiedzi:
o << std::endl
jest równoważne z następującym kodem:Innymi słowy, powinieneś używać tylko
std::endl
wtedy, gdy potrzebujesz opróżnić strumień. Na przykład:Jeśli nie musisz opróżniać strumienia, użyj
\n
zamiaststd::endl
. Dodatkowe połączeniaflush
mogą zaszkodzić wydajności (czasami znacznie).Aby uzyskać więcej informacji, zobacz cppreference.com .
Jeśli chodzi o użycie pamięci: martwienie się o
\n
kontrastd::endl
jest prawie na pewno niepotrzebną mikrooptymalizacją, ale ogólnie spodziewam się, że zajmę\n
mniej pamięci.\n
to tylko jeden bajt na końcu literału łańcucha, podczas gdy zapisstd::endl
jest tłumaczony przez kompilator na (prawdopodobnie wstawione) wywołania funkcji doput
iflush
.Różnice w zakończeniach linii specyficzne dla platformy (Windows
\r\n
kontra Linux i OS X\n
) są obsługiwane na niższym poziomie niżstd::endl
i\n
:\n
, automatycznie tłumaczy go na odpowiednie zakończenie linii właściwe dla platformy. Jeśli czytasz zakończenie linii specyficzne dla platformy, strumień automatycznie tłumaczy go na\n
.std::cout
astd::cin
w szczególności, są one traktowane tak, jakby oni w trybie tekstowym.źródło
1) Użyj przenośnościEdycja: Zgodnie z komentarzami zakończenia specyficzne dla systemu linii są obsługiwane na niższym poziomie.endl
. Nowymi wersjami systemu Windows są\r\n
Linux\n
i Mac\r
.2)
endl
opróżnia strumień,"\n"
nie robi.3) Zależy od przenośności.Jeśli chodzi o wykorzystanie pamięci, możesz ją zminimalizować, przepłukując ją do innej pamięci tak często, jak to możliwe
endl
. Zmniejszy to jednak wydajność.Edycja: Usuń kilka błędów.
źródło
\n
na każdej nowoczesnej maszynie.endl
i\n
są równoważne w odniesieniu do zakończeń linii specyficznych dla platformy; różnice między platformami są obsługiwane na niższym poziomie.End of line sequence
(przy założeniu trybu tekstowego). PoEnd of line sequence
odczytaniu z pliku jest ponownie konwertowany na „\ n”. Punkt 3) jest wątpliwy. Ostatni akapit jest znowu niepoprawny: Opróżnianie nie oszczędza miejsca, a opróżnianie bardziej niż wymagane spowolni kod (celem bufora jest poprawa wydajności zapisu na wolnym urządzeniu).