스트림 조작기 (endl) 또는 개행 이스케이프 문자 (\ n)를 사용합니까?


12

나는 질문을하는 특정 컨텍스트가 없지만 C ++에 대한 초보자 책을 읽는 동안 스트림 객체를 처리 할 때 endl 스트림 조작자와 개행 이스케이프 문자가 모두 사용되는 것을 알았습니다.

예는 다음과 같습니다.

cout << "Hello World" << endl;
cout << "Hello World\n";

내 질문은 :

  1. 특정 상황에서 스트림 조작기 (endl)를 사용하고 다른 상황에서는 이스케이프 문자를 사용하는 것이 더 적절합니까?
  2. 두 가지 중 하나를 사용하는 것이 현명한 단점이 있습니까?
  3. 그들은 완전히 상호 교환이 가능합니까?
  4. 이스케이프 시퀀스가 ​​단일 문자로 메모리에 저장되어 있음을 읽었습니다. 메모리 소비가 적을 경우 endl을 사용하는 것이 더 적합합니까?
  5. 스트림 조작기 endl이 메모리를 이스케이프 시퀀스보다 큰 경우 어떤 식 으로든 메모리를 사용합니까?

감사합니다. StackExchange Apologies에서 잘못된 섹션에 게시하면 데이터 구조로 간주됩니다.


2
endl은 일부 스트림에서 플러시를 발생 시키며 '\ n'은 그렇지 않습니다.
제임스

답변:


12

o << std::endl 다음 코드와 같습니다.

o.put(o.widen('\n'));
o.flush();

즉, std::endl스트림을 플러시해야 할 때만 사용해야 합니다. 예를 들면 다음과 같습니다.

  • 시간이 많이 걸리는 작업을 수행하려고하기 전에 메시지를 표시해야합니다.
  • 다른 프로세스가 출력을 기다리고 있습니다.
  • 둘 이상의 스레드 또는 프로세스가 실행중인 경우 각 스레드 또는 프로세스의 출력이 올바르게 표시되도록 출력을 비워야합니다. (그렇지 않으면 어색한 간격으로 임의의 출력 블록이 인터리브 된 것처럼 보일 수 있습니다.)

스트림을 플러시 할 필요 가 없으면 \n대신 을 사용하십시오 std::endl. 추가 호출로 flush인해 성능이 저하 될 수 있습니다 (때로는 크게).

자세한 내용은 cppreference.com을 참조하십시오 .

메모리 사용과 관련하여 : \n대 걱정 std::endl은 거의 확실하지 않은 미세 최적화이지만 일반적으로 \n메모리를 덜 차지할 것으로 예상 됩니다. \n는 문자열 리터럴의 끝에 하나 이상의 바이트 std::endl이며, 컴파일러는 쓰기 를 putand 로의 (아마도 인라인 된) 함수 호출로 변환 flush합니다.

행 끝에서 플랫폼 별 차이 (윈도우 \r\n리눅스와 OS X 대이 \n)보다 낮은 수준에서 처리 std::endl하고 \n:

  • 스트림이 텍스트 모드로 열린 경우을 \n쓰면 자동으로 해당 플랫폼 별 줄 끝으로 변환됩니다. 플랫폼 별 행 끝을 읽으면 스트림이 자동으로 변환합니다 \n.
  • 스트림이 이진 모드로 열리면 모든 줄 끝을 그대로 통과하여 전달합니다.
  • 의 경우 std::coutstd::cin특히, 그들은 치료하고 그들이있는 거 텍스트 모드처럼.

1

1) 이식성을 위해을 사용하십시오 endl. Windows 줄 바꿈은 \r\nLinux \n및 Mac \r입니다. 편집 : 주석에 따라 라인 시스템 특정 엔딩은 하위 수준에서 처리됩니다.

2) endl스트림을 플러시 "\n"하지 않습니다.

3) 휴대성에 따라 다릅니다.

메모리 사용량과 관련하여 가능한 한 자주 다른 저장소로 플러시하여 메모리 사용량을 최소화 할 수 있습니다 endl. 그러나 성능이 저하됩니다.

편집 : 몇 가지 실수를 해결하십시오.


2
Mac은 OS X부터 유닉스 기반이었으며 \n최신 컴퓨터 에서도 사용 됩니다.

7
죄송하지만이 내용은 올바르지 않습니다. endl\n플랫폼 별 라인 엔딩에 관해서 동등하다; 플랫폼 차이는 더 낮은 수준에서 처리됩니다.
Josh Kelley

2
첫 번째 요점이 잘못되었습니다. endl ()은 '\ n'을 스트림으로 전송합니다 (플러싱 외에도). '\ n'문자는 플랫폼 별 End of line sequence(텍스트 모드 가정 )로 변환됩니다 . 는 End of line sequence'\ n` 파일에서 읽을 때로 변환 돌아왔다. 포인트 3)은 의심 스럽다. 그리고 마지막 단락은 다시 잘못되었습니다. 플러싱은 공간을 절약하지 않으며 필요한 것 이상으로 플러싱하면 코드가 느려집니다 (버퍼 포인트는 느린 장치의 쓰기 효율을 향상시키는 것입니다).
Martin York
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.