2013-04-03 1 views
1

CString의 사용법이 값 비쌉니다. 당신은 그 예를 통해 그것을 화나게 할 수 있습니까? 또한 CString과 char 배열 중에서 메모리 측면에서 더 좋습니다.메모리 측면에서 더 좋은 CString 또는 char 배열

+1

CString은 MFC 프레임 워크에서 가져온 것입니다. std :: string은 C++ 표준입니다. 이들은 메모리에서 문자열을 관리하기위한 라이브러리 클래스입니다. 메모리 사용에 관해서 특별히 신경 쓰지 않는 한 많은 기능을 제공하므로 클래스를 벗어나는 것에 대해 걱정할 필요가 없습니다. std 문자열은 코드 이식성을 제공합니다. 메모리의 관점에서 char 배열은 장기간에 std 문자열과 같은 유틸리티 클래스는 좋은데 물건을 관리하는 데는 쓸모가 없다. –

+0

왜 ['std :: string']가 아닌가? (http://www.cplusplus.com/reference/string/string /)? – iammilind

+2

어떤 프로그램을 더 쉽게 찾을 수 있습니까? 그것은 당신의 주요 관심사가되어야합니다. 컴퓨터는 많은 메모리를 가지고 있습니다. 아주 예외적 인 프로그래밍을하지 않는 한, 문자열에 사용 된 메모리는 너무 작아서별로 쓸모가 없습니다. 그러나 잘못 작성된 문자열 처리로 인해 발생하는 버그 코드는 매우 일반적이며 매우 관련이 있습니다. – john

답변

1

문자 배열 (또는 와이드 문자) 외에도 CString에는 문자열 크기, 할당 된 버퍼 크기 및 참조 카운터 (추가로 잠금 플래그 역할을 함)가 포함됩니다. 문자 배열을 포함하는 버퍼는 포함 된 문자열보다 훨씬 클 수 있습니다. 따라서 시간이 많이 소요되는 할당 호출 수를 줄일 수 있습니다. 또한 CString을 0 크기로 설정하면 여전히 두 개의 wchar 문자가 포함됩니다.

당연히 CString의 크기를 해당 C 스타일의 배열의 크기와 비교하면 배열이 더 작아집니다. 그러나 CString에서 허용하는대로 광범위하게 문자열을 조작하려는 경우 결국 문자열 크기, 버퍼 크기 및 때때로 refcounter 및/또는 보호 플래그에 대한 자체 변수를 정의하게됩니다. 실제로 필요할 때마다 strlen을 호출하지 않도록 문자열 크기를 저장해야합니다. 버퍼를 문자열 길이보다 크게 허용하려면 버퍼 크기를 별도로 저장해야하며 문자열에 더하거나 뺄 때마다 realloc을 호출하지 않아야합니다. 그 밖에도 속도, 안전성 및 기능성이 크게 향상되면서 작은 크기를 약간 늘릴 수 있습니다.

그래서 답은 문자열로 무엇을 할 것인지에 달려 있습니다. 문자열에 로깅을위한 클래스 이름을 저장하려고한다고 가정하자. C 스타일의 문자열 (const 및 static)이 잘 수행 할 것이다. 문자열을 조작하고 MFC 또는 ATL 관련 클래스에서 광범위하게 사용하려면 CString 계열 유형을 사용하십시오. 인터페이스에서 분리 된 응용 프로그램의 "엔진"부분에서 문자열을 조작해야하며 다른 플랫폼으로 변환 될 수있는 경우 std :: string을 사용하거나 특정 요구 사항에 맞게 문자열 유형을 작성하십시오. 인터페이스와 엔진 사이에 "접착제"코드를 작성할 때 정말 유용합니다. 그렇지 않으면 std :: string이 바람직합니다.

0

CString은 Windows에 특정한 MFC 프레임 워크에서 가져옵니다. std :: string은 C++ 표준입니다. 이들은 메모리에서 문자열을 관리하기위한 라이브러리 클래스입니다. std :: string은 플랫폼간에 코드 이식성을 제공합니다.

원시 배열을 사용하는 것은 항상 메모리에 적합하지만 문자열에 대한 연산을 수행해야하며 원시 배열에서는 어려워지고, 범위를 벗어난 검사를 고려하고, 문자열 길이를 가져 오거나, 배열을 복사하거나 크기를 변경할 수 있습니다. 배열 삭제 등 모든 문제 문자열 유틸리티 클래스는 좋은 래퍼입니다. 문자열 클래스는 실제 문자열을 힙에 보관할 것이며 문자열 클래스 자체의 오버 헤드가 있습니다. 그러나 그것은 어쨌든 당신이 손으로 작성해야 문자열 메모리를 관리하는 기능을 제공합니다.

CString을 사용할 수 있으면 std :: string을 선호합니다.

0

거의 모든 경우 초심자 프로그래머는 std :: string 또는 CString (*)을 사용하는 것이 좋습니다. 처음에는 오류가 크게 줄어들 것입니다. C 배열의 잘못된 사용으로 인해 많은 버퍼 오버런, 메모리 무효화 또는 메모리 누수가 발생했습니다.

그럼 CString/std :: string 또는 원시 문자 배열이 더 효율적입니까? 일반적으로 말하자면 CString과 std :: string의 모든 문자는 크기에 대해 하나의 정수입니다. 문제는 중요합니까?

그럼 성능면에서 더 효율적입니까? 글쎄, 당신이 그걸로 무엇을하고 있는지, 어떻게 C 배열을 사용하는지에 달려 있습니다. 그러나 CString이나 std :: string arround를 전달하는 것은 C- 배열보다 계산 상 효율적입니다. C- 배열의 문제점은 누가 메모리를 소유하고 어떤 타입 (힙/스택/리터럴)인지를 확신 할 수 없다는 것입니다. 방어 프로그래밍으로 인해 어레이의 사본이 더 많이 생성되므로 필요한 전체 기간 동안 보유한 메모리가 유효한지 확인하십시오.

값으로 전달되는 경우 std :: string 또는 CString이 C- 배열보다 효율적인 이유는 무엇입니까? 이것은 조금 더 복잡하고 완전히 다른 이유입니다. CString의 경우 간단하며 COW (write on write) 객체로 구현됩니다. 따라서 한 개의 CString에서 비롯된 5 개의 객체가있을 때 하나의 객체에서 변경하기 전까지는 더 많은 메모리를 사용하지 않습니다. std :: string에는 더 엄격한 요구 사항이 있으므로 다른 std :: string 객체와 메모리를 공유 할 수 없습니다. 그러나 새로운 컴파일러를 사용하는 경우 std :: string은 이동 의미를 구현해야하므로 함수에서 문자열을 반환하면 다시 할당 할 수없는 포인터의 복사본이 생성됩니다.

원시 C 배열이 좋고 실용적인 아이디어가있는 경우는 거의 없습니다.

*) 이미 MFC에 프로그래밍하는 경우 CString을 사용하지 않는 것이 좋습니다.

관련 문제