2009-04-08 7 views

답변

15

문자열의 연산자 + 결과는 새로운 문자열입니다. 따라서 예에서

cout << "Some text" + s1 + "some more text\n"; 

전체가 cout에 쓰여지기 전에 두 개의 새 문자열이 만들어집니다 (메모리 할당을 의미 함). 첫 번째 예에서는 모든 것이 불필요한 메모리 할당없이 직접 cout에 작성됩니다.

1

큰 문자열 잠재적으로 매우 큰 성능 저하, 인,를 법원에 보내기 전에 문자열 두 번째 연접에게. 가능한 경우 첫 번째 양식을 사용하고 싶습니다.

2

예, string operator+ (const char* lhs, const string& rhs)은 이름이 지정되지 않은 임시 문자열 개체를 만들어 반환합니다.

cout << "Some text" ostream :: operator < < (const char * const)을 ostream &으로 호출하고 ostream 참조를 반환합니다.

cout << "Some text" << s1 << "some more text\n"; 

영업 이익 < < 두 가지 오버로드하는 const* char* const 걸리는 연산 < <과 영업 이익 const string& 소요 < <를 호출 cout을에 ostream::operator<<("Some text").operator<<(s1).operator<<("some more text\n"), 세 개의 전화입니다. 메모리 할당이없고 유일한 복사는 cout의 버퍼입니다.

cout << "Some text" + s1 + "some more text\n"; 

내가 ::operator+ ("Some text", s1).operator+("some more text\n")에서 임시 결과 T1 T1를 호출합니다 임시 문자열 객체에 ostream::operator<<(t1)입니다. (첫 번째 연산자 +는 string의 멤버가 아니지만 namespace 범위에서 op + (const char * const, const string &) 문자열을 반환하므로 두 번째 + "는 string :: operator + (const char * const).)

그래서 두 임시 스트링 객체는이 코드 (다음 파괴)이 생성된다. 즉, 문자열 (따라서 두 개의 메모리 할당)에 대한 두 개의 내부 표현 두 복사본 새롭게 이외에 (메모리 할당 개의 수단 . COUT의 버퍼에 복사)

5

는 다음과 같은 고려 : 그것은하지 않습니다

cout << "Some text" + " " + "some more text\n"; 

무엇 너는 생각한다. 연산자 +는 항상 연결을 의미하지는 않습니다.

편집 : 원시 문자열에 적용하면 연산자 +는 연결되지 않습니다. 문자열에 대한 포인터의 주소가 추가됩니다. 결과는 원래의 문자열과 관계가없는 메모리 영역을 가리 키기 때문에 거의 난센스가 될 수 있습니다. 운이 좋으면 프로그램이 중단됩니다.

편집 2 :이 실수를 한 지 꽤 오래되었습니다. 컴파일러가 컴파일을 거부하는 결과는 무의미합니다.

+0

귀찮게 굴지 마세요. 두 개의 포인터가 추가되었다고 설명하십시오. – tpdi

+0

예, 더 자세히 설명해주세요. 나는 그것을 시도하고 오류가 발생했습니다. 왜 그렇게됩니까? – 108

+0

포인터를 추가 할 수 없습니다. 그것은 심지어 컴파일되지 않습니다. – MSalters