programing

C++에서 문자열과 char[] 유형의 차이

iphone6s 2023. 8. 5. 09:59
반응형

C++에서 문자열과 char[] 유형의 차이

의경, 우는리를 합니다.char[]문자열을 나타냅니다.

C++의 경우 두 가지를 모두 사용하는 예를 봅니다.std::string그리고.char배열

#include <iostream>
#include <string>
using namespace std;

int main () {
  string name;

  cout << "What's your name? ";
  getline(cin, name);
  cout << "Hello " << name << ".\n";

  return 0;
}
#include <iostream>
using namespace std;

int main () {
  char name[256];

  cout << "What's your name? ";
  cin.getline(name, 256);
  cout << "Hello " << name << ".\n";

  return 0;
}

(두 예 모두 http://www.cplusplus.com 에서 채택되었습니다.)

C++에서 이 두 가지 유형의 차이는 무엇입니까? (성능, API 통합, 장단점, ...)

문자 배열은 다음과 같습니다. 문자 배열:

  • 스택에 할당된 경우(예: 예: 포함된 텍스트의 길이에 관계없이) 항상 256바이트를 차지합니다.
  • malloc() 또는 new char[]를 사용하여 힙에 할당된 경우 나중에 메모리를 해제해야 하며 항상 힙 할당의 오버헤드가 발생합니다.
  • 256자를 초과하는 텍스트를 배열에 복사하면 해당 텍스트가 손상되거나 추한 단언 메시지가 생성되거나 프로그램의 다른 위치에서 설명할 수 없는(잘못된) 동작이 발생할 수 있습니다.
  • 텍스트 길이를 결정하려면 배열을 문자별로 \0자씩 스캔해야 합니다.

문자열은 문자 배열을 포함하지만 자동으로 관리되는 클래스입니다.대부분의 문자열 구현에는 16자의 기본 배열이 있으며(짧은 문자열이 힙을 조각내지 않도록) 더 긴 문자열에 힙을 사용합니다.

다음과 같은 문자열의 문자 배열에 액세스할 수 있습니다.

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

C++ 문자열은 포함된 \0 문자를 포함할 수 있으며, 길이를 계산하지 않고 알 수 있으며, 짧은 텍스트에 대해 힙이 할당된 문자 배열보다 빠르며 버퍼 오버런으로부터 사용자를 보호합니다.또한 더 읽기 쉽고 사용하기 쉽습니다.


그러나 C++ 문자열은 DLL 경계를 넘어 사용하기에 적합하지 않습니다. 왜냐하면 이러한 DLL 함수를 사용하는 사용자는 문자열 클래스가 다르게 동작할 위험이 없도록 동일한 컴파일러와 C++ 런타임 구현을 사용해야 하기 때문입니다.

일반적으로 문자열 클래스는 호출 힙에서도 힙 메모리를 해제하므로 런타임의 공유(.dll 또는 .so) 버전을 사용하는 경우에만 메모리를 다시 확보할 수 있습니다.

요약: 모든 내부 함수와 메서드에 C++ 문자열을 사용합니다..dll 또는 .so를 작성하는 경우 공용(dll/so-exposed) 함수에서 C 문자열을 사용합니다.

의 말이 .string관리되는 유형입니다.이것이 의미하는 바는 문자열의 길이에 대해 걱정할 필요도 없고, 문자열의 메모리를 확보하거나 재할당할 필요도 없다는 것입니다.

반에은, 그것면.char[]위의 경우 표기법은 문자 버퍼를 정확히 256자로 제한했습니다.버퍼에 256자 이상을 쓰려고 하면 프로그램이 "소유"한 다른 메모리를 덮어씁니다.최악의 경우, 소유하지 않은 메모리를 덮어쓰려고 할 것이고, OS가 프로그램을 즉석에서 죽일 것입니다.

결론은?문자열은 훨씬 더 프로그래머 친화적이고 char[]는 컴퓨터에 훨씬 더 효율적입니다.

문자열 유형은 문자열에 대해 완전히 관리되는 클래스인 반면 char[]는 여전히 C에서 사용되었던 클래스로, 문자열을 나타내는 바이트 배열입니다.

API와 표준 라이브러리 측면에서는 모든 것이 char[]가 아닌 문자열로 구현되지만, libc에서 char[]를 수신하는 기능이 여전히 많이 있기 때문에 항상 std::string을 사용하는 것 외에 사용해야 할 수도 있습니다.

물론 효율성 측면에서 관리되지 않는 메모리의 원시 버퍼는 대부분의 경우 더 빠르지만 문자열을 비교하는 것을 고려하면 std::string은 항상 먼저 확인할 수 있는 크기를 가지고 있지만 char[]를 사용하면 문자별로 비교해야 합니다.

저는 개인적으로 오래된 코드와의 호환성을 제외하고는 char* 또는 char[]를 사용하고자 하는 이유를 찾을 수 없습니다.std::string은 c-string을 사용하는 것보다 느리지 않습니다. 단, 재할당을 처리합니다.생성할 때 크기를 설정할 수 있으므로 원하는 경우 재할당을 피할 수 있습니다.인덱싱 연산자([])는 일정한 시간 액세스를 제공합니다(모든 의미에서 C-string 인덱서를 사용하는 것과 완전히 동일함).at 방법을 사용하면 c-string으로 얻을 수 없는 경계 검사된 안전성도 얻을 수 있습니다.컴파일러는 대부분 릴리스 모드에서 인덱서 사용을 최적화합니다.삭제 vs 삭제[], 예외 안전, 심지어 c-string 재할당 방법과 같은 c-string을 혼란스럽게 하는 것은 쉽습니다.

그리고 COW 문자열, MT용 비COW 등과 같은 고급 개념을 다루어야 할 때는 std:: string이 필요합니다.

복사본이 걱정되는 경우, 참조 및 참조를 사용할 수 있는 모든 곳에서 사용하면 복사본으로 인한 오버헤드가 발생하지 않으며, 이는 C-string으로 수행하는 것과 동일합니다.

차이점 중 하나는 Null 종료(\0)입니다.

C 및 C++에서 char* 또는 char[]는 단일 char에 대한 포인터를 매개 변수로 사용하며 0 메모리 값(종종 널 터미네이터)에 도달할 때까지 메모리를 따라 추적합니다.

C++ 문자열은 포함된 \0자를 포함할 수 있으며, 숫자를 세지 않고 길이를 알 수 있습니다.

#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;

void NullTerminatedString(string str){
   int NUll_term = 3;
   str[NUll_term] = '\0';       // specific character is kept as NULL in string
   cout << str << endl <<endl <<endl;
}

void NullTerminatedChar(char *str){
   int NUll_term = 3;
   str[NUll_term] = 0;     // from specific, all the character are removed 
   cout << str << endl;
}

int main(){
  string str = "Feels Happy";
  printf("string = %s\n", str.c_str());
  printf("strlen = %d\n", strlen(str.c_str()));  
  printf("size = %d\n", str.size());  
  printf("sizeof = %d\n", sizeof(str)); // sizeof std::string class  and compiler dependent
  NullTerminatedString(str);


  char str1[12] = "Feels Happy";
  printf("char[] = %s\n", str1);
  printf("strlen = %d\n", strlen(str1));
  printf("sizeof = %d\n", sizeof(str1));    // sizeof char array
  NullTerminatedChar(str1);
  return 0;
}

출력:

strlen = 11
size = 11
sizeof = 32  
Fee s Happy


strlen = 11
sizeof = 12
Fee

(char *)를 string.begin()으로 생각합니다.본질적인 차이점은 (char *)가 반복자이고 std::string이 컨테이너라는 것입니다.기본 문자열을 고수할 경우 a(char *)는 std::string::iterator가 수행하는 작업을 제공합니다.반복기의 이점과 C와의 호환성을 원할 때 (char *)를 사용할 수 있지만, 이는 예외이며 규칙이 아닙니다.항상 그렇듯이 반복기가 무효화되지 않도록 주의하십시오.사람들이 (char *)가 안전하지 않다고 말할 때 이것이 그들이 의미하는 것입니다.다른 C++ 반복기만큼 안전합니다.

문자열에는 도우미 기능이 있고 문자 배열을 자동으로 관리합니다.문자열을 연결할 수 있습니다. char 배열을 새 배열로 복사해야 하며, 문자열은 런타임에 길이를 변경할 수 있습니다.문자 배열은 문자열보다 관리하기 어렵고 특정 함수는 문자열을 입력으로만 허용할 수 있으므로 배열을 문자열로 변환해야 합니다.문자열을 사용하는 것이 좋습니다. 문자열은 배열을 사용하지 않아도 되도록 만들어졌습니다.어레이가 객관적으로 더 낫다면 문자열이 없을 것입니다.

언급URL : https://stackoverflow.com/questions/1287306/difference-between-string-and-char-types-in-c

반응형