이 있는 실용적인 제한 사항만을 사용하는 std::string 대신 char 배열 및 std::벡터/대신 목록의 배열에서는 c++?

StackOverflow https://stackoverflow.com/questions/801385

문제

사용 벡터,목록,문자열과 wstrings 집에서 나의 코드입니다.이 있습 catch22s 참여하게 만들어야 하는 나에 더 관심이 있는 배열을 사용하여 시간에서,문자 및 wchars 까요?

하는 경우 기본적으로 환경에서 작업을 지원하는 표준 템플릿 라이브러리가 모든 경우를 사용하는 기본 형식이 실제로 더 나은?

도움이 되었습니까?

해결책

99%시간의 99%의 표준을 구현 라이브러리를 찾을 수 있는 std::벡터가 될 것입니다 충분히 빠르고,편의성 및 안전에서 얻을 사용하여 그들 보다는 더 많은 것보다 작은 성능이 저하될 수 있습니다.

사람들을 위해 매우 드문 경우 정말 필요할 때 베어 금속 코드,취급할 수 있습 벡터 like a C-style 배열:

vector <int> v( 100 );
int * p = &v[0];
p[3] = 42;

C++표준을 보장하는 벡터가 연속적으로 할당되므로,이것은 작동하도록 보장합니다.

에 관한 문자열 편의 요소가 almnost 압도적인 성능 문제를 이동하는 경향이 있습니다.만약 당신이 갈 beack C-식 문자열을,당신은 또한 다시 사용의 기능은 다음과 같 strlen(),이는 본질적으로 매우 inefficent 다.

으로 목록은,당신은 두 번 생각해야한다,그리고 아마도 세 번,그들을 사용하기 전에,모든지 자신의 구현 또는 표준입니다.의 대부분을 컴퓨팅 문제가 더 좋은 해결 벡터를 사용/배열입니다.이유는 목록이 나타나주에서 문학은 큰 부분이기 때문에 그들은 편리한 데이터 구조에 대한 교과서 교육 과정 작가가 사용하는 설명하는 포인터를 동적 할당 중 하나에 이동합니다.나는 여기서 이야기로 전 교육 과정 작가입니다.

다른 팁

STL 클래스 (벡터, 문자열 등)를 고수합니다. 그들은 더 안전하고, 사용하기 쉽고, 생산성이 뛰어나고, 메모리 누출을 가질 확률이 적고, Afaik은 적어도 디버그 시간 (Visual C ++)에 경계를 추가로 런타임으로 확인합니다.

그런 다음 성능을 측정하십시오. 병목 현상이 STL 클래스에있는 경우 C 스타일 문자열 및 배열 사용으로 이동하십시오.

내 경험에 따르면 벡터 또는 문자열 사용에 병목 현상을 가질 가능성은 매우 낮습니다.

한 가지 문제는 요소에 액세스 할 때 오버 헤드입니다. 인덱스별로 요소에 액세스 할 때 벡터와 문자열을 사용하더라도 먼저 버퍼 주소를 검색 한 다음 오프셋을 추가해야합니다 (수동으로 수행하지 않지만 컴파일러는 해당 코드를 방출합니다). 원시 배열을 사용하면 이미 버퍼 주소가 있습니다. 이 추가 간접은 특정한 경우에 상당한 오버 헤드로 이어질 수 있으며 성능을 향상시키고 싶을 때 프로파일 링을받습니다.

실시간 응답이 필요하지 않으면 접근 방식을 고수하십시오. 그들은 숯보다 안전합니다.

때때로 직접 작업을 수행함으로써 더 나은 성능 또는 메모리 사용을 얻을 수있는 시나리오를 만날 수 있습니다 (예 : STD :: String은 일반적으로 약 24 바이트 오버 헤드, STD :: 문자열 자체의 포인터에 대한 12 바이트가 있습니다. 동적으로 할당 된 조각의 헤더 블록).

나는 std :: 문자열에서 const char*로 변환하는 프로젝트에서 일했다. 나는이 프로젝트가 당신이 전형적이라고 부르는 것이라고 믿지 않습니다.

오, STL을 사용하면 컴파일 시간이 해를 끼칠 수 있으며 어느 시점에서 문제가 될 수 있습니다. 프로젝트가 링커로 전달되는 GB 이상의 객체 파일을 초과하면 템플릿 블로트의 양을 고려할 수 있습니다.

나는 문자열의 메모리 오버 헤드가 문제가되는 여러 프로젝트에서 작업했습니다.

애플리케이션이 어떻게 확장 해야하는지 미리 고려할 가치가 있습니다. 무한한 수의 줄을 저장 해야하는 경우 const char*전 세계적으로 관리되는 문자열 테이블로 S는 엄청난 양의 메모리를 절약 할 수 있습니다.

그러나 일반적으로 달리 할 이유가없는 한 STL 유형을 확실히 사용하십시오.

내가 믿는 기본 메모리 할당 기법은 버퍼를 위한 벡터와 문자열은 하나로 할당하는 금액을 두 번의 메모리마다 현재 할당된 메모리 사용됩니다.이 수 있는 낭비입니다.을 제공할 수 있습니다 사용자 정의 할당자는 물론...

다른 것은 고려할 스택에 대힙.Staticly 이즈 배열 및 문에 앉을 수 있습니다 스택,또는 적어도 컴파일러를 처리하는 메모리 관리습니다.새로운 컴파일러의 처리를 동적으로 크기 배열을 너무 당신을 위해 제공하는 경우 관련 C99/C++0x 기능입니다.벡터와 문자열은 항상 사용하여 힙이 도입할 수 있는 성능 문제가 있으면 정말로 꽉 제약 조건이 있습니다.

엄지 손가락의 규칙으로 사용한 무지 않는 상처 당신의 프로젝트의 속도/메모리 오버헤드...당신은 아마는 99%의 물건 STL 제공하는 클래스 저장 당신이 시간과 노력에 영향을 거의 응용 프로그램 성능이다.(i.e"avoid 조 최적화")

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