2010-01-20 4 views

답변

8

리터럴에서 온 문자열 상수의 경우에만 const char[]을 사용합니다. std::string의 가장 큰 장점은 메모리 관리가 무료이지만 문자열 리터럴에서는 문제가되지 않는다는 것입니다.

어쨌든 리터럴의 실제 유형이며 이전 C 스타일 Null 종료 문자열 또는 C++ 문자열 (암시 적 변환 실행)이 필요한 API에서 직접 사용할 수 있습니다. 또한 포인터 대신 배열을 사용하여 컴파일 시간 크기 구현을 얻습니다.

이제는 함수 인터페이스를 정의 할 때 상수가 전달되도록 의도 된 경우에도 const char*이 아닌 std::string을 선호합니다. 이는 후자의 경우 크기가 손실되고 다시 계산해야 할 필요가 있기 때문입니다.

내 자신의 경험에서. 필자는 정보/오류 메시지가있는 리터럴 문자열에 대해 로깅 라이브러리 (가변 인수를 사용)를 호출 할 때마다 각각 .c_str()의 writting을 작성했습니다.

2

을 말한다. 특별한 요구 사항이 없다면 모든 메모리 작업을 수행하기 때문에 std::string을 사용합니다.

문자열 리터럴의 경우 const char*을 사용합니다. const char[]에 대한 이유는 const char*을 사용하여 다른 상수를 초기화 할 수 있기 때문입니다. 다음 코드를 확인하십시오

const char str1[] = "str1"; 
const char* str11 = "str11"; 

const char str2[] = str1; // <<< compile error 
const char* str22 = str11; // <<< OK 

문자열 리터럴은 프로그램의 완료 될 때까지 유효합니다 정적 저장 (2.13.4/2)에 따라 기간이 너무 포인터 const char* 있습니다.

+0

많은 다른 장소에서 동일한 문자열을 사용하면 일반 STL 구현에서 복사 속도가 빨라지고 일반 C 문자열보다 사용하기가 쉽습니다. 당신이 많은 언어를 지원해야 할 필요가 있다면 std :: wstring을 사용할 것입니다. – jdehaan

+0

@jdehaan : (m) STL 라이브러리 구현 (STL 구현이 아니라 'std :: string'이 STL의 일부가 아니었던 경우)에 놀랐습니다. 아직 COW를 수행하고 있습니다. MT 환경에서 이것은 일반적으로 비관론으로 바뀝니다. 작은 문자열 최적화 (작은 문자열은 힙에 할당되지 않지만 스택에있는 스택)는 현재 일반적으로 선호되는 것입니다. – sbi

+0

대부분의 구현에서 copy on write (여전히 존재하는 경우)가 제거됩니다. 사용자 관점 (다른 std :: string을 참조)에서 스레드로부터 안전하다고 보이는 일부 조작은 스레드로부터 안전하지 않을 수 있으므로 다중 스레드 환경에서는 문제점이 있습니다. 수정을 위해 각 사본이 다른 스레드로 전달 될 때 복사되는 문자열을 생각해보십시오. 각 쓰레드는 자체 문자열을 가지며 공유 객체는 없지만 사실 'copy-on-write'내부 구현에는 경쟁 조건이있을 수 있습니다. 라이브러리에 잠금 메커니즘을 추가하면 대부분의 경우 일반 구현보다 속도가 느려집니다. –

2

무엇을하고 계십니까? 당신의 방법은 무엇을 기대합니까?

const char은 저장시 더 가볍지 만 std :: string의 강력 함이나 사용시 안전하지 않습니다. 그러나 C API가 많은 경우보다 현명한 선택이 될 수 있습니다.

std :: string이 선호됩니다.

+2

.c_str()은 (는) 친구입니다. – JPvdMerwe

+0

@JPvdMerwe : theatrus is correct. 만약 당신이하고있는 일이'const char * '를 요구하는 함수에 상수 문자열을 넘기는 것이라면'std :: string' /'.c_str()'을 사용할 필요가 없습니다. 'char'의'const' 배열은 생성자 호출 비용을 가지지 않으며'std :: string'보다는 함수에 전달하기가 저렴하고 저렴하게 만드는 함수에 직접 전달 될 수 있습니다. –

+0

예 문자열 리터럴의 경우 완전히 동의하지만 프로세서 시간을 낭비하지 않습니다. – JPvdMerwe

1

문자열 리터럴의 경우 const char *보다 const std::string을 선호하는 경향이 있습니다. 문자열 리터럴을 const std::string &을 사용하는 함수로 전달할 때마다 하나씩 호출 될 때마다 자동으로 문자열이 작성되기 때문입니다. 그러나 내가 주로 const char *을 기대하는 함수와 함께 리터럴을 사용한다면 나는 대신 그것을 사용할 것입니다.

나는 API에 대해 std::string을 선호하는 경향이 있습니다.

물론 유니 코드를 사용하는 경우 std::wstringwchar_t을 사용합니다.

+0

나는 유니 코드에 관해서도 같은 가정을했지만 이것은 흥미 롭다 : http://utf8everywhere.org/. Win32 API가 WCHAR 네이티브 인 것처럼 wchar_t는 유니 코드 히스토리에서 더 간단한 시간의 유물이라는 것이 밝혀졌습니다. UTF-8과 std :: string을 고수하면 삶의 질이 향상 될 수 있습니다. – terriblememory

관련 문제