문제

요즘 C++에서 C-문자열을 사용해야 할 이유가 있나요?내 교과서에서는 특정 지점의 예제에서 이를 사용하고 있으며 std::string을 사용하는 것이 더 쉬울 것이라고 생각합니다.

도움이 되었습니까?

해결책

내가 이를 사용해야 했던 유일한 이유는 C 스타일 문자열을 사용하는 타사 라이브러리와 인터페이스할 때입니다.성능상의 이유로 C 스타일 문자열을 사용하는 난해한 상황도 있을 수 있지만, 인라인화 및 특수화 등으로 인해 C++ 문자열에 메서드를 사용하는 것이 더 빠른 경우가 많습니다.

당신은 사용할 수 있습니다 c_str() 이러한 종류의 API로 작업할 때 많은 경우 메서드를 사용하지만 반환된 char *는 const라는 점을 알아야 하며 해당 포인터를 통해 문자열을 수정해서는 안 됩니다.이러한 종류의 상황에서는 대신 벡터<char>를 사용할 수 있으며 최소한 메모리 관리가 더 쉬워지는 이점을 얻을 수 있습니다.

다른 팁

몇 가지 추가 메모리 제어 참고사항:

C 문자열은 POD 유형이므로 애플리케이션의 읽기 전용 데이터 세그먼트에 할당될 수 있습니다.선언하고 정의하면 std::string 네임스페이스 범위에서 상수를 사용하면 컴파일러는 이전에 실행되는 추가 코드를 생성합니다. main() 그것은 전화 std::string 각 상수에 대한 생성자입니다.애플리케이션에 상수 문자열이 많은 경우(예:상수 문자열을 사용하는 C++ 코드를 생성한 경우) 이 상황에서는 C 문자열이 더 나을 수 있습니다.

일부 구현 std::string SSO("짧은 문자열 최적화" 또는 "작은 문자열 최적화")라는 기능을 지원합니다. std::string 클래스에는 특정 길이까지의 문자열에 대한 저장 공간이 포함되어 있습니다.이로 인해 크기가 증가합니다. std::string 그러나 종종 무료 저장소 할당/할당 취소 빈도를 크게 줄여 성능을 향상시킵니다.구현하는 경우 std::string SSO를 지원하지 않는 경우 빈 std::string 스택에서는 여전히 자유 저장 할당을 수행합니다.그런 경우에는 임시 스택 할당 C 문자열을 사용하는 것이 문자열을 사용하는 성능이 중요한 코드에 도움이 될 수 있습니다.물론, 이 때 발에 총을 쏘지 않도록 조심해야 합니다.

그것이 수많은 API/라이브러리에서 나오는 방식이기 때문입니까?

코드에 꽤 일반적으로 필요한 문자열 상수가 있다고 가정해 보겠습니다.C++ 개체보다 C 문자열로 정의하는 것이 더 가볍고 이식성이 뛰어납니다.이제 이러한 문자열을 다양한 함수에 전달하려는 경우 이러한 함수가 C++ 문자열 개체를 요구하는 대신 C 문자열을 허용하는 것이 좋습니다.

물론 문자열이 변경 가능하다면 C++ 문자열 개체를 사용하는 것이 훨씬 더 편리합니다.

메모리 제어.저는 최근 대규모 멀티스레드 애플리케이션에서 약 200-300MB 크기의 문자열(실제로는 데이터베이스의 blob)을 처리해야 했습니다.문자열의 복사본이 하나만 더 있으면 32비트 주소 공간이 버스트될 수 있는 상황이었습니다.나는 문자열의 복사본이 몇 개나 존재하는지 정확히 알아야 했습니다.나는 STL 전도사이지만 char * then을 사용했는데, 그 이유는 추가 메모리나 추가 복사본이 할당되지 않는다는 보장을 제공했기 때문입니다.나는 얼마나 많은 공간이 필요한지 정확히 알고있었습니다.

그 외에도 표준 STL 문자열 처리에는 문자열 처리/구문 분석을 위한 몇 가지 훌륭한 C 기능이 누락되어 있습니다.다행히 std::string에는 내부 버퍼에 대한 const 액세스를 위한 c_str() 메서드가 있습니다.printf()를 사용하려면 여전히 char *를 사용해야 합니다(C에서 가장 유용한 기능 중 하나인 printf와 유사한 기능을 포함하지 않는다는 것은 C++ 팀의 미친 아이디어입니다.Boost::format이 곧 STL에 포함되기를 바랍니다.

함수에 필요한 경우 끊임없는 string 프로그램이 std::string, CString, EString 또는 다른 곳을 사용하더라도 나는 여전히 'const char*'(또는 const wchar_t*)를 사용하는 것을 선호합니다.

호출자가 문자열을 std::string으로 사용하고 'const char*'가 최소 공통 분모인지 확인하기에는 대규모 코드 베이스에 문자열 소스가 너무 많습니다.

많은 기본 함수가 여전히 C 문자열을 인수로 기대하거나 반환하기 때문에 교과서에는 구식 C 문자열이 포함되어 있습니다.또한 메모리에 있는 문자열의 기본 구조에 대한 통찰력을 제공합니다.

C++ 코드가 "깊은" 경우(커널에 가깝고 C 라이브러리에 크게 의존하는 등) std::string 내부 및 외부로의 많은 변환을 피하기 위해 명시적으로 C 문자열을 사용할 수 있습니다.물론, 다른 언어 도메인(Python, Ruby 등)과 인터페이스하는 경우에도 같은 이유로 그렇게 할 수 있습니다.그렇지 않으면 std::string을 사용하십시오.

일부 게시물에서는 메모리 문제를 언급합니다.이것이 std::string을 피하는 좋은 이유일 수 있지만 char*는 아마도 최선의 대체품은 아닐 것입니다.아직은 OO언어입니다.자신만의 문자열 클래스가 char*보다 나을 수도 있습니다.더 효율적일 수도 있습니다. 예를 들어 작은 문자열 최적화(Small String Optimization)를 적용할 수 있습니다.

내 경우에는 2GB 파일에서 약 1GB 상당의 문자열을 가져와 약 60개 필드가 있는 레코드에 넣은 다음 서로 다른 필드를 7번 정렬하려고 했습니다.내 이전 코드는 char*를 사용하는 데 25시간이 걸렸고 내 코드는 1시간 만에 실행되었습니다.

초기화 규칙과 여러 플랫폼에서 가능한 모든 문자열 구현을 디버깅하는 데 너무 많은 시간을 소비한 후에는 정적 문자열이 const char*여야 합니다.

잘못된 char* 코드와 메모리 누수를 디버깅하는 데 너무 많은 시간을 소비한 후에는 모든 비정적 문자열을 일종의 문자열 개체로 사용하는 것이 좋습니다.프로파일링을 통해 더 나은 작업을 수행할 수 있고 수행해야 한다는 사실이 나타날 때까지 ;-)

선택의 여지가 있다면 일반적으로 기본 C 문자열을 선택할 이유가 없습니다(char*)를 C++ 문자열(std::string).그러나 선택의 여지가 없는 경우가 많습니다.예를 들어, std::fstream의 생성자는 역사적인 이유로 C 문자열을 사용합니다.또한 C 라이브러리(예상하셨겠지만!)는 C 문자열을 사용합니다.

자신의 C++ 코드에서 사용하는 것이 가장 좋습니다. std::string 필요에 따라 객체의 C 문자열을 추출합니다. c_str() 기능 std::string.

사용중인 라이브러리에 따라 다릅니다.예를 들어, MFC, Windows API의 다양한 부분을 작업할 때 CString을 사용하는 것이 더 쉬운 경우가 많습니다.또한 Win32 애플리케이션에서는 std::string보다 성능이 더 좋은 것 같습니다.

그러나 std::string은 C++ 표준의 일부이므로 더 나은 이식성을 원한다면 std::string을 사용하세요.

조작 중인 문자열을 저장하기 위한 힙이 부족하고 문자열 버퍼의 결정론적 사전 할당이 필요한 대부분의 임베디드 플랫폼과 같은 애플리케이션의 경우.

c 문자열은 클래스라는 오버헤드를 전달하지 않습니다.

c 문자열은 일반적으로 기계 수준에 더 가깝기 때문에 더 빠른 코드를 생성할 수 있습니다.

이것은 나쁜 코드를 작성할 수 없다는 말은 아닙니다.다른 모든 구성과 마찬가지로 오용될 수 있습니다.

역사적인 이유로 이를 요구하는 풍부한 라이브러리 호출이 있습니다.

c 문자열과 stl 문자열을 사용하는 방법을 배우고 적절할 때 각각을 사용하십시오.

1) "문자열 상수"는 C 문자열(const char *)이며 이를 const std::string&로 변환하는 것은 런타임 프로세스이며 반드시 단순하거나 최적화된 것은 아닙니다.2) fstream 라이브러리는 C 스타일 문자열을 사용하여 파일 이름을 전달합니다.

내 경험 법칙은 어쨌든 데이터를 std::string으로 사용하려는 경우(예: 벡터에 저장할 때) const std::string&을 전달하고 다른 경우에는 const char *를 전달하는 것입니다.

std::string을 모르는 레거시 코드입니다.또한 C++11 이전에는 std::ifstream 또는 std::ofstream을 사용하여 파일을 여는 것은 파일 이름에 대한 입력으로 const char*를 사용하는 경우에만 가능했습니다.

STL 문자열은 확실히 사용하기 훨씬 쉽고, 사용하지 않을 이유가 없습니다.

C 스타일 문자열만 인수로 사용하는 라이브러리와 상호 작용해야 하는 경우 언제든지 문자열 클래스의 c_str() 메서드를 호출할 수 있습니다.

이를 수행하는 일반적인 이유는 문자열 처리에서 버퍼 오버플로 작성을 즐기기 때문입니다.계산된 문자열은 종료된 문자열보다 훨씬 우수하므로 C 디자이너가 종료된 문자열을 사용한 이유를 이해하기 어렵습니다.당시에는 나쁜 결정이었습니다.지금은 나쁜 결정이에요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top