[C++] 문자열 c_str () 대 data ()


Answers

C ++ 11 / C ++ 0x 에서 data()c_str() 은 더 이상 다릅니다. 따라서 data() 도 끝에 null 종료가 있어야합니다.

21.4.7.1 basic_string 접근 자 [string.accessors]

const charT* c_str() const noexcept;

const charT* data() const noexcept;

1 반환 값 : [0,size()]i 에 대해 p + i == &operator[](i) 와 같은 포인터 p.

21.4.5 basic_string 요소 액세스 [string.access]

const_reference operator[](size_type pos) const noexcept;

1 요구 사항 : pos <= size (). 2 *(begin() + pos) if pos < size() : *(begin() + pos) if pos < size() , 그렇지 않으면 charT(); 값을 갖는 T 유형의 객체에 대한 참조 charT(); 참조 된 값은 수정되지 않아야한다.

Question

c_str()data() (STL 및 다른 구현에서 c_str() 의 차이점은 c_str() 이 null이 아니라 data() 가 항상 종료된다는 점입니다. 지금까지 실제 구현에서 보았던 것처럼, 그들은 동일한 또는 data() 호출을 c_str() 호출합니다.

내가 여기서 무엇을 놓치고 있니? 어떤 시나리오에서 사용하는 것이 더 정확합니까?




그것은 이미 응답되었으며, 목적에 대한 몇 가지주의 사항 : 시행의 자유.

std::string 연산 - 예 : 반복, 연결 및 요소 변형 - 제로 터미네이터가 필요하지 않습니다. 0으로 끝나는 문자열을 기대하는 함수에 string 을 전달하지 않으면 생략 할 수 있습니다.

구현시 실제 문자열 데이터를 공유 할 수 있습니다. string::substr 은 내부적으로 공유 문자열 데이터 및 시작 / 끝 범위에 대한 참조를 보유 할 수 있으므로 실제 문자열 데이터의 복사 (및 추가 할당)를 피할 수 있습니다. 구현은 c_str을 호출하거나 문자열을 수정할 때까지 복사본을 연기합니다. 관련된 문장이 읽혀지면 사본을 만들 수 없습니다.

(copy-on-write 구현은 멀티 스레드 환경에서 그리 재미있는 것은 아니며 일반적인 메모리 / 할당 절감은 오늘날보다 복잡한 코드의 가치가 없으므로 거의 수행되지 않습니다.

마찬가지로, string::data 는 다른 내부 표현을 허용합니다 (예 : 로프 (문자열 세그먼트의 링크 된 목록)). 이렇게하면 삽입 / 교체 작업이 크게 향상 될 수 있습니다. 다시 말하면, c_str 이나 data 를 호출 할 때 세그먼트 목록을 단일 세그먼트로 축소해야합니다.