스트림 조작기 (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::cout와 std::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.